diff --git a/.github/workflows/build_and_publish.yaml b/.github/workflows/build_and_publish.yaml index 16a058020..967543fd3 100644 --- a/.github/workflows/build_and_publish.yaml +++ b/.github/workflows/build_and_publish.yaml @@ -47,19 +47,18 @@ jobs: uses: gradle/gradle-build-action@v2 with: arguments: build + gradle-home-cache-cleanup: true env: MOD_VERSION: ${{ steps.get_version.outputs.result }} - MINECRAFT_VERSION: ${{ steps.get_mc_version.outputs.result }} - GRADLE_BUILD_ACTION_CACHE_DEBUG_ENABLED: true - name: Publish uses: gradle/gradle-build-action@v2 with: arguments: publish + gradle-home-cache-cleanup: true env: MAVEN_USER: ${{ secrets.MAVEN_USER }} MAVEN_PASS: ${{ secrets.MAVEN_PASS }} MOD_VERSION: ${{ steps.get_version.outputs.result }} - MINECRAFT_VERSION: ${{ steps.get_mc_version.outputs.result }} - name: Update CHANGELOG id: changelog uses: klikli-dev/changelog-action@main @@ -96,7 +95,6 @@ jobs: files: | build/libs/theurgy-${{ steps.get_mc_version.outputs.result }}-${{ steps.get_version.outputs.result }}.jar - build/libs/theurgy-${{ steps.get_mc_version.outputs.result }}-${{ steps.get_version.outputs.result }}-sources.jar name: theurgy-${{ steps.get_mc_version.outputs.result }}-${{ steps.get_version.outputs.result }}.jar version: ${{ steps.get_mc_version.outputs.result }}-${{ steps.get_version.outputs.result }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 56e4badf4..aa5a7e479 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,14 +4,6 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [beta/v1.20.1-1.3.10] - 2023-07-22 -### :sparkles: New Features -- [`15f3d29`](https://github.com/klikli-dev/theurgy/commit/15f3d29338092e027670949d9f3259abead5b5af) - update modonomicon *(commit by [@klikli-dev](https://github.com/klikli-dev))* - -### :wrench: Chores -- [`7cc05c1`](https://github.com/klikli-dev/theurgy/commit/7cc05c1f64c759021883077593b0c3f0991abf8f) - update jei version rage *(commit by [@klikli-dev](https://github.com/klikli-dev))* - - ## [beta/v1.20.1-1.3.9] - 2023-07-22 ### :sparkles: New Features - [`a194764`](https://github.com/klikli-dev/theurgy/commit/a19476437b60c83787b50bb88b7147341c431d5c) - switch to cloudsmith maven *(commit by [@klikli-dev](https://github.com/klikli-dev))* @@ -221,13 +213,4 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [beta/v1.19.4-1.3.0]: https://github.com/klikli-dev/theurgy/compare/beta/v1.19.4-.0.0.0...beta/v1.19.4-1.3.0 [beta/v1.19.4-1.3.1]: https://github.com/klikli-dev/theurgy/compare/beta/v1.19.4-1.3.0...beta/v1.19.4-1.3.1 [beta/v1.19.4-1.3.2]: https://github.com/klikli-dev/theurgy/compare/beta/v1.19.4-1.3.1...beta/v1.19.4-1.3.2 -[beta/v1.19.4-1.3.3]: https://github.com/klikli-dev/theurgy/compare/beta/v1.19.4-1.3.2...beta/v1.19.4-1.3.3 -[beta/v1.19.4-1.3.4]: https://github.com/klikli-dev/theurgy/compare/beta/v1.19.4-1.3.3...beta/v1.19.4-1.3.4 -[beta/v1.19.4-1.3.5]: https://github.com/klikli-dev/theurgy/compare/beta/v1.19.4-1.3.4...beta/v1.19.4-1.3.5 -[beta/v1.20-1.3.5]: https://github.com/klikli-dev/theurgy/compare/beta/v1.20-0.0.0...beta/v1.20-1.3.5 -[beta/v1.20.1-1.3.5]: https://github.com/klikli-dev/theurgy/compare/beta/v1.20.1-0.0.0...beta/v1.20.1-1.3.5 -[beta/v1.20.1-1.3.6]: https://github.com/klikli-dev/theurgy/compare/beta/v1.20.1-1.3.5...beta/v1.20.1-1.3.6 -[beta/v1.20.1-1.3.7]: https://github.com/klikli-dev/theurgy/compare/beta/v1.20.1-1.3.6...beta/v1.20.1-1.3.7 -[beta/v1.20.1-1.3.8]: https://github.com/klikli-dev/theurgy/compare/beta/v1.20.1-1.3.7...beta/v1.20.1-1.3.8 -[beta/v1.20.1-1.3.9]: https://github.com/klikli-dev/theurgy/compare/beta/v1.20.1-1.3.8...beta/v1.20.1-1.3.9 -[beta/v1.20.1-1.3.10]: https://github.com/klikli-dev/theurgy/compare/beta/v1.20.1-1.3.9...beta/v1.20.1-1.3.10 \ No newline at end of file +[beta/v1.19.4-1.3.3]: https://github.com/klikli-dev/theurgy/compare/beta/v1.19.4-1.3.2...beta/v1.19.4-1.3.3 \ No newline at end of file diff --git a/LICENSES/LGPL-3.0-only.txt b/LICENSES/LGPL-3.0-only.txt deleted file mode 100644 index 513d1c01f..000000000 --- a/LICENSES/LGPL-3.0-only.txt +++ /dev/null @@ -1,304 +0,0 @@ -GNU LESSER GENERAL PUBLIC LICENSE -Version 3, 29 June 2007 - -Copyright (C) 2007 Free Software Foundation, Inc. - -Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. - -This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. - -0. Additional Definitions. - -As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. - -"The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. - -An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. - -A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". - -The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. - -The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. - -1. Exception to Section 3 of the GNU GPL. -You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. - -2. Conveying Modified Versions. -If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: - - a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. - -3. Object Code Incorporating Material from Library Header Files. -The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license document. - -4. Combined Works. -You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: - - a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license document. - - c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. - - e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) - -5. Combined Libraries. -You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. - -6. Revised Versions of the GNU Lesser General Public License. -The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. - -If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. - -GNU GENERAL PUBLIC LICENSE -Version 3, 29 June 2007 - -Copyright © 2007 Free Software Foundation, Inc. - -Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. - -Preamble - -The GNU General Public License is a free, copyleft license for software and other kinds of works. - -The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. - -When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. - -To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. - -For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. - -Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. - -For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. - -Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. - -Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. - -The precise terms and conditions for copying, distribution and modification follow. - -TERMS AND CONDITIONS - -0. Definitions. - -“This License” refers to version 3 of the GNU General Public License. - -“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. - -“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. - -To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. - -A “covered work” means either the unmodified Program or a work based on the Program. - -To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. - -To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. - -An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. - -1. Source Code. -The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. - -A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. - -The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. - -The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. - -The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. - -The Corresponding Source for a work in source code form is that same work. - -2. Basic Permissions. -All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. - -You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. - -Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. - -3. Protecting Users' Legal Rights From Anti-Circumvention Law. -No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. - -When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. - -4. Conveying Verbatim Copies. -You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. - -You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. - -5. Conveying Modified Source Versions. -You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”. - - c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. - -A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. - -6. Conveying Non-Source Forms. -You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: - - a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. - - d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. - -A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. - -A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. - -“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. - -If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). - -The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. - -Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. - -7. Additional Terms. -“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. - -When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. - -Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or authors of the material; or - - e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. - -All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. - -If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. - -Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. - -8. Termination. -You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). - -However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. - -Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. - -Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. - -9. Acceptance Not Required for Having Copies. -You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. - -10. Automatic Licensing of Downstream Recipients. -Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. - -An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. - -You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. - -11. Patents. -A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”. - -A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. - -Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. - -In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. - -If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. - -If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. - -A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. - -Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. - -12. No Surrender of Others' Freedom. -If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. - -13. Use with the GNU Affero General Public License. -Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. - -14. Revised Versions of this License. -The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. - -If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. - -Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. - -15. Disclaimer of Warranty. -THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -16. Limitation of Liability. -IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -17. Interpretation of Sections 15 and 16. -If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. - -END OF TERMS AND CONDITIONS - -How to Apply These Terms to Your New Programs - -If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. - -To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - -If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. - -You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . - -The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . diff --git a/README.md b/README.md index d33ad3294..e0ee08681 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,6 @@ confidence. Copyright 2022 klikli-dev -Code is licensed under the MIT license, view [LICENSES/MIT](./LICENSES/MIT.txt). -Assets are licensed under the CC-BY-SA-4.0 license, view [LICENSES/CC-BY-SA-4.0](./LICENSES/CC-BY-4.0.txt). -Third party software and assets may be distributed under a different license, see [THIRD_PARTY_NOTICES.md](./THIRD_PARTY_NOTICES.md). +Code is licensed under the MIT license, view [LICENSES/MIT](./LICENSES/MIT.txt). +Assets are licensed under the CC-BY-SA-4.0 license, view [LICENSES/CC-BY-SA-4.0](./LICENSES/CC-BY-4.0.txt). +Third party software and assets may be distributed under a different license, see [THIRD_PARTY_NOTICES.md](./THIRD_PARTY_NOTICES.md). diff --git a/build.gradle b/build.gradle index 3fd6e8b40..bd89cf1f6 100644 --- a/build.gradle +++ b/build.gradle @@ -43,9 +43,17 @@ minecraft { // Please read: https://stackoverflow.com/questions/2031163/when-to-use-the-different-log-levels property 'forge.logging.console.level', 'debug' + //Fix for mixin refmap crash (in our case for AU) + property 'mixin.env.remapRefMap', 'true' + property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" + // Comma-separated list of namespaces to load gametests from. Empty = all namespaces. property 'forge.enabledGameTestNamespaces', 'theurgy' + // enable using JBR to hotswap MOAR + // also ignore the option if someone isnt using JBR + jvmArgs '-XX:+AllowEnhancedClassRedefinition', '-XX:+IgnoreUnrecognizedVMOptions' + mods { "${mod_id}" { source sourceSets.main @@ -60,8 +68,16 @@ minecraft { property 'forge.logging.console.level', 'debug' + //Fix for mixin refmap crash (in our case for AU) + property 'mixin.env.remapRefMap', 'true' + property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" + property 'forge.enabledGameTestNamespaces', 'theurgy' + // enable using JBR to hotswap MOAR + // also ignore the option if someone isnt using JBR + jvmArgs '-XX:+AllowEnhancedClassRedefinition', '-XX:+IgnoreUnrecognizedVMOptions' + mods { "${mod_id}" { source sourceSets.main @@ -79,6 +95,10 @@ minecraft { property 'forge.logging.console.level', 'debug' + //Fix for mixin refmap crash (in our case for AU) + property 'mixin.env.remapRefMap', 'true' + property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" + property 'forge.enabledGameTestNamespaces', 'theurgy' mods { @@ -95,6 +115,10 @@ minecraft { property 'forge.logging.console.level', 'debug' + //Fix for mixin refmap crash (in our case for AU) + property 'mixin.env.remapRefMap', 'true' + property 'mixin.env.refMapRemappingFile', "${projectDir}/build/createSrgToMcp/output.srg" + // Specify the modid for data generation, where to output the resulting resource, and where to look for existing resources. args '--mod', 'theurgy', '--all', '--output', file('src/generated/resources/'), '--existing', file('src/main/resources/') @@ -118,10 +142,18 @@ repositories { } } maven { - name = "JEI" + name = "JEI and AlmostUnified" url = 'https://maven.blamejared.com/' content { includeGroup "mezz.jei" + includeGroup "com.almostreliable.mods" + } + } + maven { + name = 'GeckoLib' + url = 'https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/' + content { + includeGroup "software.bernie.geckolib" } } } @@ -139,6 +171,12 @@ dependencies { compileOnly fg.deobf("mezz.jei:jei-${minecraft_version}-forge-api:${jei_version}") runtimeOnly fg.deobf("mezz.jei:jei-${minecraft_version}-forge:${jei_version}") + //almostunified + implementation fg.deobf("com.almostreliable.mods:almostunified-forge:${minecraft_version}-${almost_unified_version}") + + //Geckolib + implementation fg.deobf("software.bernie.geckolib:geckolib-forge-${geckolib_minecraft_version}:${geckolib_version}") + //modonomicon compileOnly fg.deobf("com.klikli_dev:modonomicon-${minecraft_version}-common:${modonomicon_version}") implementation fg.deobf("com.klikli_dev:modonomicon-${minecraft_version}-forge:${modonomicon_version}") @@ -180,7 +218,7 @@ publishing { url = 'https://github.com/klikli-dev/theurgy' licenses { license { - name = 'MIT License' + name = 'MIT AND CC-BY-4.0' url = 'https://github.com/klikli-dev/theurgy#licensing' } } @@ -216,5 +254,3 @@ afterEvaluate { options.compilerArgs << "-Xmaxerrs" << "2000" } } - -processResources.setDuplicatesStrategy(DuplicatesStrategy.WARN) \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 1c287b957..4c89cb5d9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -27,13 +27,19 @@ group=com.klikli_dev mod_id=theurgy mod_name=Theurgy mod_license=MIT AND CC-BY-4.0 -mod_version=1.3.8 +mod_version=1.4.0 mod_authors=Kli Kli mod_description=An open-source magic mod built around classical alchemy to replicate and transmute matter, and create magical artifacts. ## Dependency Properties -jei_version=15.2.0.22 +jei_version=15.2.0.23 jei_version_range=[15.2.0.0,) modonomicon_version=1.38.5 -modonomicon_version_range=[1.38.1,) \ No newline at end of file +modonomicon_version_range=[1.38.1,) +almost_unified_version=0.5.0 +almost_unified_version_range=[0.5.0,) +# geckolib currently names their files after 1.20 +geckolib_minecraft_version=1.20 +geckolib_version=4.2 +geckolib_version_range=[4.2,) \ No newline at end of file diff --git a/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 b/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 new file mode 100644 index 000000000..5bdfda435 --- /dev/null +++ b/src/generated/resources/.cache/103d9f3f36b01595f1aa5172191e60eff02e6924 @@ -0,0 +1,4 @@ +// 1.20.1 2023-06-14T18:13:30.5425607 Registries +b9dc44db0143205750319e6a0e908376bc98d251 data/theurgy/forge/biome_modifier/add_sal_ammoniac_ore.json +eed8cd1911e09af63a869a86d83ab846401194f9 data/theurgy/worldgen/configured_feature/sal_ammoniac_ore.json +3983ae18720546d5efb83e7ac1aa81c774492d63 data/theurgy/worldgen/placed_feature/sal_ammoniac_ore.json diff --git a/src/generated/resources/.cache/36b27e4a9e87bb9edde2c7e0abd4798ee5ccadb9 b/src/generated/resources/.cache/36b27e4a9e87bb9edde2c7e0abd4798ee5ccadb9 new file mode 100644 index 000000000..467f35826 --- /dev/null +++ b/src/generated/resources/.cache/36b27e4a9e87bb9edde2c7e0abd4798ee5ccadb9 @@ -0,0 +1,7 @@ +// 1.20.1 2023-06-28T18:41:54.6848695 Multiblocks: theurgy +063aa91958795c57f58083ca62e775e9476a9407 data/theurgy/modonomicon/multiblocks/placement/calcination_oven.json +c480adc4c7baf9ba5321c4ee48193369676f8762 data/theurgy/modonomicon/multiblocks/placement/distiller.json +b9d8372529ac674469f93113632ad36c34e3a053 data/theurgy/modonomicon/multiblocks/placement/incubator.json +40277a7901437bd284fc57eedf1a0c3376bf0712 data/theurgy/modonomicon/multiblocks/placement/liquefaction_cauldron.json +9ecbb6214a85f4e42d664e0e4c320d4deaa4ecd6 data/theurgy/modonomicon/multiblocks/placement/pyromantic_brazier.json +d58572d664b1efc48e0e520dbc6aec93b700341e data/theurgy/modonomicon/multiblocks/placement/sal_ammoniac_accumulator.json diff --git a/src/generated/resources/.cache/3fa62e6e7a071b2d9f296990c67d7a2df0006913 b/src/generated/resources/.cache/3fa62e6e7a071b2d9f296990c67d7a2df0006913 index 3ab13a47e..c1d37dd9a 100644 --- a/src/generated/resources/.cache/3fa62e6e7a071b2d9f296990c67d7a2df0006913 +++ b/src/generated/resources/.cache/3fa62e6e7a071b2d9f296990c67d7a2df0006913 @@ -1,6 +1,34 @@ -// 1.20.1 2023-06-16T15:33:23.1735098 Books: theurgy +// 1.20.1 2023-07-20T16:49:53.4033832 Books: theurgy ead61475fc866f8eb903a6d99236808a0383fd5a data/theurgy/modonomicon/books/the_hermetica/book.json -3a4b111882abf1b08df5ba3159faf2cab89f3c3e data/theurgy/modonomicon/books/the_hermetica/categories/getting_started.json -28ae6dbc76158bf163aa0d3ca564f6158642ef69 data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/about_mod.json -18c55d191c21c11592ff7e80c4f7d98ab1fbfab9 data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/divination_rod.json -40b96909739d7276b24a3549b02d3c78f5008ef1 data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/intro.json +6397585a0c454daf7ca44fdfcd96a0fe11081905 data/theurgy/modonomicon/books/the_hermetica/categories/getting_started.json +1629a778e477590cb0efd667e8b859d3b665c84c data/theurgy/modonomicon/books/the_hermetica/categories/spagyrics.json +210cf9c37c3c0294b58f4a54b7c4e93025792b74 data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/about_divination_rods.json +d76d5e184a4d9f7793add0d1b3d00b689cf9eb68 data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/about_mod.json +49a641fb5a0f49d9aa0bf09ac3f3f400783f1ab9 data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/about_ore_refining.json +f93531b8ed5951cf0cc730321045b436d9f9a7b2 data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/abundant_and_common_sulfur_attuned_divination_rod.json +6ea2baa437e4b966e76cb7ba36edf7e0466a2e06 data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/amethyst_divination_rod.json +29077029775d026fad0c79b57320ec8b42877600 data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/apparatus_how_to.json +2398259d45dbe9c7c82ff71b4b2f2e34638f1e71 data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/create_mercury.json +102429754a637746618440e77060ee738e230726 data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/create_salt.json +7c386d3ea0e927e5414ba7871366bb0471c63844 data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/create_solvent.json +50218e2b0cc8ad7fe319ccc6bb24577ec33e69dd data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/create_sulfur.json +4757ca66842869fc4dcb41d3df9214a3b410390e data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/incubation.json +e12436dfc3cebdeaef7d4881f36adec2f77c93e7 data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/intro.json +c954d5a48200ef468d779a25abc6e06d5839c42b data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/needed_apparatus.json +28e0f6620e5c9679a3440a315d588a92110c4ab8 data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/precious_sulfur_attuned_divination_rod.json +80e03ad70c4c628c0910c7b63ae7fa7b3e4795d9 data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/rare_sulfur_attuned_divination_rod.json +b57cfb886c90c850b98f3ad4da495632ddceffef data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/spagyrics.json +5eab1c1c7a4b3e4c45167a00afcb12f4259389f2 data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/spagyrics_link.json +a6e91d27d58bde11ef2077b6b2d557901453d9c0 data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/t1_divination_rod.json +1d531a62ba91279909e7baf234c889bed9daec8b data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/t2_divination_rod.json +a34621a80190e5984fa2a5cc4f2ffbeaf5eeae7d data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/t3_divination_rod.json +2c63fd1bb0a8b1d76e5a33bbac35b2412db13c55 data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/t4_divination_rod.json +606565ad971b369b2ee9c4123e7b2d2a3df7062e data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/about_ore_refining_link.json +0c2e406c34f44e354a043e9134fbca21b5f235a0 data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/calcination_oven.json +87248cfd462acc7b6cddfd81b0bee9dac357801b data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/distiller.json +c5f51b786bfc5c7a7803362acde27cfba40b1107 data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/incubator.json +583a601b3829afee551c1cf53eb72a37db7176d2 data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/intro.json +d3b133f22a814c94248deec0e585fc9c43228179 data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/liquefaction_cauldron.json +331cba56f57b89d6ecbf894b01af825e50e108d9 data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/principles.json +385ca34ac424c982fe951a36bbf2063af212639b data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/pyromantic_brazier.json +8a14684d4563cf8f4ba7212e7f5b19fcc8e2db48 data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/solvents.json diff --git a/src/generated/resources/.cache/444362c84684b9346bb4ad16fb33ed185ef17ccc b/src/generated/resources/.cache/444362c84684b9346bb4ad16fb33ed185ef17ccc new file mode 100644 index 000000000..20b76954e --- /dev/null +++ b/src/generated/resources/.cache/444362c84684b9346bb4ad16fb33ed185ef17ccc @@ -0,0 +1,16 @@ +// 1.20.1 2023-06-19T13:35:19.3019162 Calcination Recipes +77aaf59ed4e959adc3d5ff35577b9c1af13ffde0 data/theurgy/recipes/calcination/crops.json +91ce7283a5d8bf210f825e1c7f3899c840caa238 data/theurgy/recipes/calcination/mineral.json +2c2a45ef208781a281ba2aa635752a2f7471e871 data/theurgy/recipes/calcination/mineral_from_gems.json +a5cbe077c2033e01d36194645de8d0bf1f6f2fe0 data/theurgy/recipes/calcination/mineral_from_ingots.json +318a5ed36db7c407466c1e9742dc61e4f8765a96 data/theurgy/recipes/calcination/mineral_from_ores.json +9d67c0f1d86b52ffaae734811734ac70a7ba4370 data/theurgy/recipes/calcination/mineral_from_other_minerals.json +e86404797d860ec34b10f879af93c72c918f391d data/theurgy/recipes/calcination/mineral_from_raw_materials.json +ba195891125b128d161451e25dbb074953885711 data/theurgy/recipes/calcination/strata_from_clay.json +cca77a84bbe10e2025dbb21013c98da6622b1a6f data/theurgy/recipes/calcination/strata_from_clay_ball.json +b2f66c8002d24f641587f9807d9f0c99b5db0a47 data/theurgy/recipes/calcination/strata_from_cobblestone.json +6b1de9114f62125e92b14b80c789afc47db95a2d data/theurgy/recipes/calcination/strata_from_dirt.json +e867a7fc92a15c664a74efd17f663b1e1a97590f data/theurgy/recipes/calcination/strata_from_gravel.json +40b9c77832ad8a7da93f8d58899b67d7daadae40 data/theurgy/recipes/calcination/strata_from_sand.json +d8c4c5d9875cf9c50d24fcbcf19c0c735dbd6fe4 data/theurgy/recipes/calcination/strata_from_sandstone.json +ca4f676293c126a473b34a97b7d2cd69167c4d28 data/theurgy/recipes/calcination/strata_from_stone.json diff --git a/src/generated/resources/.cache/44e062bf203da5d734205f46ac5f2eb38d3b96a5 b/src/generated/resources/.cache/44e062bf203da5d734205f46ac5f2eb38d3b96a5 new file mode 100644 index 000000000..48ff31d44 --- /dev/null +++ b/src/generated/resources/.cache/44e062bf203da5d734205f46ac5f2eb38d3b96a5 @@ -0,0 +1,39 @@ +// 1.20.1 2023-07-21T14:14:36.0585203 Block States: theurgy +ef875fc2604f4f19d7604536c66d3d2c26163879 assets/theurgy/blockstates/calcination_oven.json +92ebf87f417e3426f30d3e42eeafd933e446eb23 assets/theurgy/blockstates/deepslate_sal_ammoniac_ore.json +efc838dc92770522219889024bec42cc52fb93bd assets/theurgy/blockstates/distiller.json +79abbe84f5fcb3cb7db64f4c0f8f13c4e3f58674 assets/theurgy/blockstates/incubator.json +08bfb53e16229544b84ea69caac5d11239d3c8b0 assets/theurgy/blockstates/incubator_mercury_vessel.json +08bfb53e16229544b84ea69caac5d11239d3c8b0 assets/theurgy/blockstates/incubator_salt_vessel.json +08bfb53e16229544b84ea69caac5d11239d3c8b0 assets/theurgy/blockstates/incubator_sulfur_vessel.json +05305f7086817341ef70a4df92bf81a24bb0b6da assets/theurgy/blockstates/liquefaction_cauldron.json +e94d251a012694f4b0bc2925acbc4ee418cacf10 assets/theurgy/blockstates/pyromantic_brazier.json +e25b9fd36f56996169e155aa79e3e84f839dd1b4 assets/theurgy/blockstates/sal_ammoniac_accumulator.json +07484732b0d8c8ceed31f3e1c6dba80b2bf3af1d assets/theurgy/blockstates/sal_ammoniac_ore.json +7e9441f84cb260a4530af62c538ba22adef2b090 assets/theurgy/blockstates/sal_ammoniac_tank.json +c79ce877fb80454b4c5ea666bcc5584c881e8c11 assets/theurgy/models/block/calcination_oven.json +1b2abf8ea6c69bedb184fdd7d9e799622de293bd assets/theurgy/models/block/deepslate_sal_ammoniac_ore.json +c79ce877fb80454b4c5ea666bcc5584c881e8c11 assets/theurgy/models/block/distiller.json +744bb5bfa023c4a5f75f323cf41ceb96fc8e6512 assets/theurgy/models/block/incubator_lower.json +1f0891d84076af849389e112d5be50136aee8938 assets/theurgy/models/block/incubator_pipe.json +ca16a8ebdf82f8f110050978885ae52f50c774e8 assets/theurgy/models/block/incubator_upper.json +c79ce877fb80454b4c5ea666bcc5584c881e8c11 assets/theurgy/models/block/incubator_vessel.json +1144aa12cc110991e79d9c636180b33178a26f2f assets/theurgy/models/block/liquefaction_cauldron_lower.json +c79ce877fb80454b4c5ea666bcc5584c881e8c11 assets/theurgy/models/block/liquefaction_cauldron_upper.json +52afb4cf68605f9a482f6332b02f523a81b74168 assets/theurgy/models/block/pyromantic_brazier.json +90588f4755497f3c8df737fd06b92d33ff4d0542 assets/theurgy/models/block/pyromantic_brazier_lit.json +3d636dd41003fc736ccdcfb3599acc337df2fcd3 assets/theurgy/models/block/sal_ammoniac_accumulator.json +1d93f7f921865f74ffbb18817595c1c1316d322d assets/theurgy/models/block/sal_ammoniac_ore.json +c79ce877fb80454b4c5ea666bcc5584c881e8c11 assets/theurgy/models/block/sal_ammoniac_tank.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/calcination_oven.json +aff0eca2c86c1736edbfdc778cb40693db3bbd55 assets/theurgy/models/item/deepslate_sal_ammoniac_ore.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/distiller.json +4a721dcf1ec96ada832e645a961eba0f754d15d5 assets/theurgy/models/item/incubator.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/incubator_mercury_vessel.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/incubator_salt_vessel.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/incubator_sulfur_vessel.json +7452e23d15a4905caefbd048ff18482ccaab75c2 assets/theurgy/models/item/liquefaction_cauldron.json +0040a92c6a948e59b36cb138ba297ede4435095c assets/theurgy/models/item/pyromantic_brazier.json +06b56e124d971cd220c73012c14b4d0adeb032d2 assets/theurgy/models/item/sal_ammoniac_accumulator.json +62725c755954bb986667238373b2f56bbcd0dfd4 assets/theurgy/models/item/sal_ammoniac_ore.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/sal_ammoniac_tank.json diff --git a/src/generated/resources/.cache/469c78d8f4486110280e6206cdb5f7533d7b17cf b/src/generated/resources/.cache/469c78d8f4486110280e6206cdb5f7533d7b17cf new file mode 100644 index 000000000..f1732e175 --- /dev/null +++ b/src/generated/resources/.cache/469c78d8f4486110280e6206cdb5f7533d7b17cf @@ -0,0 +1,44 @@ +// 1.20.1 2023-06-22T16:36:15.6407947 Tags for minecraft:item mod id theurgy +7a78325a639e879280cccf4d15f364e02da86003 data/forge/tags/items/gems.json +9a414088a384ea8077655b79eb53ac263aaae5e3 data/forge/tags/items/gems/sal_ammoniac.json +04abd356cb9b230f4d1adcf90db05571e8a17d05 data/forge/tags/items/ores/sal_ammoniac.json +9148832ee4e83df2b37e23918707fd8046f26ff7 data/forge/tags/items/ores_in_ground/deepslate.json +f8295983ffdb0c42c6c8b12788a5b63c1eb43f72 data/forge/tags/items/ores_in_ground/stone.json +c1ae367d1f7b1391996652acb8c12cfbe63abfc8 data/theurgy/tags/items/alchemical_mercuries.json +07760e14b03fd0089485f8825e5961fedbd2ab80 data/theurgy/tags/items/alchemical_salts.json +7e640bba62ec6219c3e3def2845f665fdb1e9cba data/theurgy/tags/items/alchemical_sulfurs.json +34afd6e0275950da142439ac05cd7455f47850e4 data/theurgy/tags/items/alchemical_sulfurs/abundant.json +4356e96ae4efb2a5a21bcc7e7d0ac4e68ae4f0a3 data/theurgy/tags/items/alchemical_sulfurs/common.json +266413752c11313070378f2d5cc88f57a4a87cbd data/theurgy/tags/items/alchemical_sulfurs/gems.json +99734639ab59a8484a1f580b87d9d464df9930cc data/theurgy/tags/items/alchemical_sulfurs/gems/abundant.json +1744f55d3aa4e665ad91f91136b4efc9df851779 data/theurgy/tags/items/alchemical_sulfurs/gems/common.json +9dfadee6a62915083364c85f35e3e02edd9cc85e data/theurgy/tags/items/alchemical_sulfurs/gems/precious.json +da0a721f168248128254577d7aeb8ebcd9d9c473 data/theurgy/tags/items/alchemical_sulfurs/gems/rare.json +3fbcd6156c7403e016aedcf8bbef778ce64e75d2 data/theurgy/tags/items/alchemical_sulfurs/metals.json +90b2123e0734b83147c7faf3a7772e3b0a20788b data/theurgy/tags/items/alchemical_sulfurs/metals/abundant.json +d83463626204ada454a14f6956bedf9e647be1ec data/theurgy/tags/items/alchemical_sulfurs/metals/common.json +36f96d4379ff19623fd154c9a8afcf831e799c29 data/theurgy/tags/items/alchemical_sulfurs/metals/precious.json +3fae5e025887ac81bc3af216a6f53572f05b4ad8 data/theurgy/tags/items/alchemical_sulfurs/metals/rare.json +75c922d072696062be2074a5680b2557f1641cef data/theurgy/tags/items/alchemical_sulfurs/other_minerals.json +142ff74a3b72e964ea337b1cf4eee9e8689ed8a9 data/theurgy/tags/items/alchemical_sulfurs/other_minerals/abundant.json +a1f5db5c4c9d4b747e83dd3f796c8698304575bf data/theurgy/tags/items/alchemical_sulfurs/other_minerals/common.json +35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/theurgy/tags/items/alchemical_sulfurs/other_minerals/precious.json +35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/theurgy/tags/items/alchemical_sulfurs/other_minerals/rare.json +a60fef1f5fe3c9aab793de4942e301732c51df6a data/theurgy/tags/items/alchemical_sulfurs/precious.json +214fcce95acb2086d5fd0fd4247b8445aaf55efd data/theurgy/tags/items/alchemical_sulfurs/rare.json +c2e9d4fba333d2af3dbe84b5773c1c1c5e055dc4 data/theurgy/tags/items/gems/mercury/high.json +959c361f3fbee6edb10161ff4ebc2850ef625547 data/theurgy/tags/items/gems/mercury/low.json +e85a6add1492e3a02b8a37a6308fc632e930180f data/theurgy/tags/items/gems/mercury/medium.json +dd248dce97f06027745077215c44f2840b3d6685 data/theurgy/tags/items/metals/mercury/high.json +1ec36d4d19b4be396697dc03365e232bf0e42c97 data/theurgy/tags/items/metals/mercury/low.json +67412e7cf25103161049bc0ac62570357f558191 data/theurgy/tags/items/metals/mercury/medium.json +b119b915f2e2b16c4a5750a50453a2cfddf7235f data/theurgy/tags/items/ores/mercury/high.json +f844cd452a39f1295f45a4cb9585a1510a719986 data/theurgy/tags/items/ores/mercury/low.json +201dcad9991b37cbbe3388aafec4048eebaae020 data/theurgy/tags/items/ores/mercury/medium.json +cddb5c3b26d739614cdd25038f449762a5af9732 data/theurgy/tags/items/other_minerals.json +35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/theurgy/tags/items/other_minerals/mercury/high.json +cddb5c3b26d739614cdd25038f449762a5af9732 data/theurgy/tags/items/other_minerals/mercury/low.json +60a5194a30db746b92cf1af2a2eeeca4af7ba1ff data/theurgy/tags/items/other_minerals/mercury/medium.json +ca75039df5ed6330ee575eb55689e8f23a1e7a99 data/theurgy/tags/items/raw_materials/mercury/high.json +ba40677f5ca89c0a487417a60d1bb1fc6e20b837 data/theurgy/tags/items/raw_materials/mercury/low.json +6c46417f3830c1411e097320c5d40fcee9cf28a7 data/theurgy/tags/items/raw_materials/mercury/medium.json diff --git a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d new file mode 100644 index 000000000..697fed86a --- /dev/null +++ b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d @@ -0,0 +1,13 @@ +// 1.20.1 2023-06-14T19:35:03.3878238 Loot Tables +72c4014c4a8e846f945380a01c02fc8516e774d7 data/theurgy/loot_tables/blocks/calcination_oven.json +fd1d6c22b80bf3f1357dd9e23231ce1758e3799f data/theurgy/loot_tables/blocks/deepslate_sal_ammoniac_ore.json +03da56ccdb1e9f132dc38e079668c8ab7689d708 data/theurgy/loot_tables/blocks/distiller.json +6c720dcf480aec782d85abcd5adaf5e0aed3af95 data/theurgy/loot_tables/blocks/incubator.json +affc4e07fa5ea6f2710ba2f12a1ed95ff1f9a400 data/theurgy/loot_tables/blocks/incubator_mercury_vessel.json +5bb357c4c5616c30a5985da942447ae5108e4f8a data/theurgy/loot_tables/blocks/incubator_salt_vessel.json +83df72953dd0ffbd8bb793f6c3003f011fe7b31c data/theurgy/loot_tables/blocks/incubator_sulfur_vessel.json +76df8364f6cb252e8cae7ad4f8586d87686843f4 data/theurgy/loot_tables/blocks/liquefaction_cauldron.json +548d06109872a2a9d7f8fbd451414f671be41c36 data/theurgy/loot_tables/blocks/pyromantic_brazier.json +1e9e39c1ec35fd04a371c081e9e0dc8e1f246cb1 data/theurgy/loot_tables/blocks/sal_ammoniac_accumulator.json +30f8dbf50bc546bce7c73245555a0393ae17d798 data/theurgy/loot_tables/blocks/sal_ammoniac_ore.json +58718450c1d42ff9ef53e693e753fc0c820c79b9 data/theurgy/loot_tables/blocks/sal_ammoniac_tank.json diff --git a/src/generated/resources/.cache/8427b0a980665b286efcd7446b1247414f24e76c b/src/generated/resources/.cache/8427b0a980665b286efcd7446b1247414f24e76c new file mode 100644 index 000000000..441087f10 --- /dev/null +++ b/src/generated/resources/.cache/8427b0a980665b286efcd7446b1247414f24e76c @@ -0,0 +1,3 @@ +// 1.20.1 2023-06-14T18:13:30.5375529 Tags for minecraft:fluid mod id theurgy +c5e02d06f56acf2f6153655b74e7d7f22d5750a6 data/theurgy/tags/fluids/sal_ammoniac.json +a36da82105fb95e08c30643937a39170fdde549f data/theurgy/tags/fluids/solvent.json diff --git a/src/generated/resources/.cache/93765a0f723bc6097e750f2a441254a1f7b8ae08 b/src/generated/resources/.cache/93765a0f723bc6097e750f2a441254a1f7b8ae08 new file mode 100644 index 000000000..9295b9780 --- /dev/null +++ b/src/generated/resources/.cache/93765a0f723bc6097e750f2a441254a1f7b8ae08 @@ -0,0 +1,2 @@ +// 1.20.1 2023-06-14T18:13:30.5425607 Shapeless Crafting Recipes +bd9adbc64c1dad493a909a3f4b90ac016757432c data/theurgy/recipes/crafting/shapeless/the_hermetica.json diff --git a/src/generated/resources/.cache/96e1c194aa2b8cdd63adb750d34ba507337ea835 b/src/generated/resources/.cache/96e1c194aa2b8cdd63adb750d34ba507337ea835 new file mode 100644 index 000000000..987e265c9 --- /dev/null +++ b/src/generated/resources/.cache/96e1c194aa2b8cdd63adb750d34ba507337ea835 @@ -0,0 +1,20 @@ +// 1.20.1 2023-07-21T16:10:02.0907092 Shaped Crafting Recipes +10616b9ecf4903d076f75f2b754a415125413d44 data/theurgy/recipes/crafting/shaped/amethyst_divination_rod.json +10238f21b147011c777703fc0ade32f5708fd6ad data/theurgy/recipes/crafting/shaped/calcination_oven.json +6a7516fc2ef20dd0f00eef151afe455f64038667 data/theurgy/recipes/crafting/shaped/distiller.json +23cc9ffeb1383e5fead6a158948b62eb5b3a2f97 data/theurgy/recipes/crafting/shaped/divination_rod_t1.json +b147e20c9fc286b8571f45aebd2cc845d12b80bd data/theurgy/recipes/crafting/shaped/divination_rod_t2.json +daad93aefa89912ae4a624f64b96e6106f5b32ed data/theurgy/recipes/crafting/shaped/divination_rod_t3.json +3f469caf98fa40c1dd36a6d73485cb32db5915b4 data/theurgy/recipes/crafting/shaped/divination_rod_t4.json +8141e9f1a1eccfcb5b4c476751830b2600a2cd80 data/theurgy/recipes/crafting/shaped/incubator.json +98cd8062185f5ac689b3648ceada3e936ecdafc2 data/theurgy/recipes/crafting/shaped/incubator_mercury_vessel.json +6c291f8d512ac8c2438964c5d84644a5a348f090 data/theurgy/recipes/crafting/shaped/incubator_salt_vessel.json +3cdba94c6ace0476e53fb22cb4825e022430a8d8 data/theurgy/recipes/crafting/shaped/incubator_sulfur_vessel.json +02972fe4520e57e7c9bed4e3cb4382c2290b133c data/theurgy/recipes/crafting/shaped/liquefaction_cauldron.json +3c4bb4a4dd344b7d4cf2117d22125b0f47492423 data/theurgy/recipes/crafting/shaped/pyromantic_brazier.json +f227545084d653722a0d993c1b8ea7fb73447f12 data/theurgy/recipes/crafting/shaped/sal_ammoniac_accumulator.json +a29b1881ae565d790b09ee568780627b7854e0fe data/theurgy/recipes/crafting/shaped/sal_ammoniac_tank.json +447b0ae8e48b94342498e573e74f31835a60a98f data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_abundant.json +6300e5cdd6946b5b3c4e9b746ffe89201eb8e76b data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_common.json +955fcae63e0152bf5ba17358268b11a64ce20618 data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_precious.json +ef5d8ffdd9121d3d6075b05247bd9d10f4802ab7 data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_rare.json diff --git a/src/generated/resources/.cache/97e04e705b4e3084289e96c3d45fb37ff92d03b3 b/src/generated/resources/.cache/97e04e705b4e3084289e96c3d45fb37ff92d03b3 new file mode 100644 index 000000000..62c663e07 --- /dev/null +++ b/src/generated/resources/.cache/97e04e705b4e3084289e96c3d45fb37ff92d03b3 @@ -0,0 +1,45 @@ +// 1.20.1 2023-07-03T14:22:49.6649755 Distillation Recipes +5e4c5dcaecf0c17527e3f6133729af7438e41421 data/theurgy/recipes/distillation/beef.json +9c6c3d557c2e78f2196ad36e810fe00b3eef449d data/theurgy/recipes/distillation/bread.json +e4d3332698b89f382776c5ea48e52e4402947215 data/theurgy/recipes/distillation/chicken.json +499ed207efcd2d1fe0c7710b63e3c72f9b4c81c1 data/theurgy/recipes/distillation/cobblestone.json +70652635c2d4c146e517dafd1f3a7aae3fb00c58 data/theurgy/recipes/distillation/cod.json +228f750d1b3b054bafecd0571b4c44e1c929d283 data/theurgy/recipes/distillation/cooked_beef.json +39c0c3f6b290a72afb8a32cf44b6d2d7c413d0e1 data/theurgy/recipes/distillation/cooked_chicken.json +e21757211d7672915435aa967d8666138313b485 data/theurgy/recipes/distillation/cooked_cod.json +89d705230bb699b0f154856c2cb9b6bd4ec16836 data/theurgy/recipes/distillation/cooked_porkchop.json +524fbebdb61203742f663675808f6fe56857a53a data/theurgy/recipes/distillation/cooked_rabbit.json +4b6518bc0011602e7e35ead280b281cf0c5a42bd data/theurgy/recipes/distillation/cooked_salmon.json +1c50fcf0b22cb3465e5d5b53a459ab3ea5c04e74 data/theurgy/recipes/distillation/crops.json +2feadfa3198bfe21b22c4697dd53b37acec155f7 data/theurgy/recipes/distillation/dirt.json +12553282d8aed2f4237126fa460d903afa51c299 data/theurgy/recipes/distillation/dyes.json +34e45b92536d705a931782dc0765040644498fb2 data/theurgy/recipes/distillation/flowers.json +084ab6367d63cbf3f9c7eb19ad91bd7d09a30bc6 data/theurgy/recipes/distillation/gems.mercury.high.json +5c0caa8c22b7a037a9d3936fc3a9a105818f0c47 data/theurgy/recipes/distillation/gems.mercury.low.json +06add491268b4974cc6fd1cc11f7df8ee4f83abb data/theurgy/recipes/distillation/gems.mercury.medium.json +7d48b7129e64fac6ba5ff3001d57a90676e33823 data/theurgy/recipes/distillation/glass.json +8083dbd15548ec3b0dff3b95adb2537941baf4b7 data/theurgy/recipes/distillation/gravel.json +71fe385fb4a93cf37d661721a0017b340750ef0a data/theurgy/recipes/distillation/leaves.json +0d5bbfb4f84cf62ef57b8a2c5a93293e24c32e51 data/theurgy/recipes/distillation/logs.json +d45054ef35ceb6918ee72ef1d897236c56a30cd7 data/theurgy/recipes/distillation/metals.mercury.high.json +330264a9b0197df93c8ee69fb01e45ee3fd23286 data/theurgy/recipes/distillation/metals.mercury.low.json +e4b290ce5b9adbe5eeaaadd9d03597a58546d32a data/theurgy/recipes/distillation/metals.mercury.medium.json +0074ad539289b8438f5b90beebd4f6b9085eb69f data/theurgy/recipes/distillation/ores.mercury.high.json +42fd60143150cabb2b9bf3cfe2696551dfdd3487 data/theurgy/recipes/distillation/ores.mercury.low.json +cd44e5f64533b28df907b1e52ff5e89fba8fd64d data/theurgy/recipes/distillation/ores.mercury.medium.json +3e331c65ca126aa42c52a0a6ea1d58b28678d45e data/theurgy/recipes/distillation/other_minerals.mercury.high.json +2bb2bb9c1360a75dc1fc15a41ad02d0abb561a7b data/theurgy/recipes/distillation/other_minerals.mercury.low.json +1c15f07f3632794ebe00509eca99eba9dce7f6ba data/theurgy/recipes/distillation/other_minerals.mercury.medium.json +ce64e76938ed1bf26bbc467c65a665d71ac1e417 data/theurgy/recipes/distillation/planks.json +41f6c0394f2bbc4bb12179dbc0b05cae3dec0222 data/theurgy/recipes/distillation/porkchop.json +3616f21cfed6061be5678e81425c4f27fc45ab2b data/theurgy/recipes/distillation/rabbit.json +884b6836b82fb85c513f0ac98c72e14c30f17de3 data/theurgy/recipes/distillation/raw_materials.mercury.high.json +24625b7331a6a98173e80399929ae27664931a9f data/theurgy/recipes/distillation/raw_materials.mercury.low.json +4a9f05e6bc1fb69640070a28e265262676847cab data/theurgy/recipes/distillation/raw_materials.mercury.medium.json +d00594bf52ef0417489812598f0c2959c596fe3a data/theurgy/recipes/distillation/salmon.json +dd164a154045764f4b3dda0399407bce117ecf46 data/theurgy/recipes/distillation/sand.json +5b213bb2438395334674ff15be6b9fab6b0ad1b5 data/theurgy/recipes/distillation/sandstone.json +b8bcece1f5510485623c0d5d4ecfe36fe45c716a data/theurgy/recipes/distillation/saplings.json +7febef30c6f5c924599eda0d52c3a39a602b8529 data/theurgy/recipes/distillation/stone.json +b231fb321382a5a698274bf1d853110cfe9f7256 data/theurgy/recipes/distillation/stone_bricks.json +236f86448878b571241d840d946358ce58c44bd4 data/theurgy/recipes/distillation/wool.json diff --git a/src/generated/resources/.cache/99bd38532c9b9669f44ee0e07deea72afe0f2aef b/src/generated/resources/.cache/99bd38532c9b9669f44ee0e07deea72afe0f2aef new file mode 100644 index 000000000..de376b706 --- /dev/null +++ b/src/generated/resources/.cache/99bd38532c9b9669f44ee0e07deea72afe0f2aef @@ -0,0 +1,16 @@ +// 1.20.1 2023-06-14T18:13:30.5415613 Tags for minecraft:block mod id theurgy +0fcdb0064991d93ee3af5633b952de0970a4b669 data/forge/tags/blocks/ores.json +04abd356cb9b230f4d1adcf90db05571e8a17d05 data/forge/tags/blocks/ores/sal_ammoniac.json +9148832ee4e83df2b37e23918707fd8046f26ff7 data/forge/tags/blocks/ores_in_ground/deepslate.json +f8295983ffdb0c42c6c8b12788a5b63c1eb43f72 data/forge/tags/blocks/ores_in_ground/stone.json +0fcdb0064991d93ee3af5633b952de0970a4b669 data/minecraft/tags/blocks/mineable/pickaxe.json +0fcdb0064991d93ee3af5633b952de0970a4b669 data/minecraft/tags/blocks/needs_stone_tool.json +46c2e1f6b178d2493d40b314ee3cfb58b98a12a6 data/theurgy/tags/blocks/divination_rod_t1_allowed_blocks.json +35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/theurgy/tags/blocks/divination_rod_t1_disallowed_blocks.json +2b89c3efd8f8c9fa27b1e5ede259f7655e262f58 data/theurgy/tags/blocks/divination_rod_t2_allowed_blocks.json +35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/theurgy/tags/blocks/divination_rod_t2_disallowed_blocks.json +848cb0eace5305f39f8b47ec1a720e60731f7051 data/theurgy/tags/blocks/divination_rod_t3_allowed_blocks.json +35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/theurgy/tags/blocks/divination_rod_t3_disallowed_blocks.json +620ba8d8f6a68655fbe648c93bff517ebf0a626f data/theurgy/tags/blocks/divination_rod_t4_allowed_blocks.json +35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/theurgy/tags/blocks/divination_rod_t4_disallowed_blocks.json +256f0f76f7cd7623a24c8a72d2089445b131d1a0 data/theurgy/tags/blocks/incubator_vessels.json diff --git a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e deleted file mode 100644 index f0d89df64..000000000 --- a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e +++ /dev/null @@ -1 +0,0 @@ -// 1.20.1 2023-06-14T17:22:20.6045632 Recipes diff --git a/src/generated/resources/.cache/a712c7094f0a9eb0bca39d53c159ea6414e2f817 b/src/generated/resources/.cache/a712c7094f0a9eb0bca39d53c159ea6414e2f817 new file mode 100644 index 000000000..85f89e68d --- /dev/null +++ b/src/generated/resources/.cache/a712c7094f0a9eb0bca39d53c159ea6414e2f817 @@ -0,0 +1,87 @@ +// 1.20.1 2023-06-14T18:13:30.5375529 Liquefaction Recipes +6e4bf07ddc81db54cd232dfc87ac9c85a4c05ea9 data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_ingots_allthemodium.json +d0211fb77e2764220e09324c80dc3b095fe382bf data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_ores_allthemodium.json +53006efe2842c83bb516d3f36a33b737e1b7e6b6 data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_raw_materials_allthemodium.json +906c6081905e4ab28009ae76c33040feaa7361f7 data/theurgy/recipes/liquefaction/alchemical_sulfur_amethyst_from_gems_amethyst.json +ef86d5fb2cadcbe79d613bdce30e89d2f4f19a96 data/theurgy/recipes/liquefaction/alchemical_sulfur_apatite_from_gems_apatite.json +42639b215f594cb2888c34d86374f8118c989d34 data/theurgy/recipes/liquefaction/alchemical_sulfur_apatite_from_ores_apatite.json +6ec6db1297ec3031c1d212961b66cfbd5a1d20ab data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_ingots_azure_silver.json +8446fa9a720d1c84230cdc883746fb390aa74974 data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_ores_azure_silver.json +2a6e38c6c34199c014b704adaf62e79c63c340c2 data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_raw_materials_azure_silver.json +ca0620191f81bcb30b02c5796fcb0f386a1b67ca data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_ingots_cinnabar.json +d65e6a5dd3ede567f11d8f1a2d766951e52706d9 data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_ores_cinnabar.json +1577feed59709aff13b088a2dfd66d298b9b9d1f data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_raw_materials_cinnabar.json +ccf2e1eed38df2d382c7f2cd61e5943e350a9188 data/theurgy/recipes/liquefaction/alchemical_sulfur_coal_from_coals.json +32cd45e5e87645a18978125ac277d0b8238cfdc0 data/theurgy/recipes/liquefaction/alchemical_sulfur_coal_from_ores_coal.json +14fb6a6a79a75de5ea997134ca7ca961f813625e data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_ingots_copper.json +8ad00f55dd7fd9ba78cf0988829477b92c166174 data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_ores_copper.json +daef9cb777ece2b914bd0f97392dfff0ad03281e data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_raw_materials_copper.json +e5f49384a36b852e3718864919c682abb6f28ed3 data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_ingots_crimson_iron.json +f71145359c28b6a9e3eb0ed34ae6031ae031e954 data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_ores_crimson_iron.json +0d3ae9277104b2a5404d4249c07873c12798f11e data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_raw_materials_crimson_iron.json +9101490b3d2fb2fd4722b8bcbcd8f7009f9c65bd data/theurgy/recipes/liquefaction/alchemical_sulfur_diamond_from_gems_diamond.json +1c47b2e7394e4c61d45f93c4fb4d385da96d6d89 data/theurgy/recipes/liquefaction/alchemical_sulfur_diamond_from_ores_diamond.json +151012edf955561a3a5983df8be36468bcb49e20 data/theurgy/recipes/liquefaction/alchemical_sulfur_emerald_from_gems_emerald.json +fa4ee838ec9e8ae25c73c0eb77a04bb02a6bbd04 data/theurgy/recipes/liquefaction/alchemical_sulfur_emerald_from_ores_emerald.json +2c91347c5c1d6589b6c775ef85cd570537e86e5e data/theurgy/recipes/liquefaction/alchemical_sulfur_fluorite_from_gems_fluorite.json +67a0119412cbc3e1326a8d1a01cbc6bb808d47ee data/theurgy/recipes/liquefaction/alchemical_sulfur_fluorite_from_ores_fluorite.json +75b632976360619603b6d24c0ea374c93e8ae255 data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_ingots_gold.json +ead6038b6bd6565a6e31838f55eabc0eb9436011 data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_ores_gold.json +9af3b32fa0136c2e4cac78e54a1d9e9f8c5d1404 data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_raw_materials_gold.json +f512a492010b2bf8f1b9058b9d2a0996b4bba076 data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_ingots_iridium.json +a58e57370d1a0155edd0bfbfd46de674ecd038c8 data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_ores_iridium.json +567d6001e8f2001bcc86e000140d616c92185209 data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_raw_materials_iridium.json +7eb3caeb0bcaa8f2312d8c72056ccb7cd5126386 data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_ingots_iron.json +5eac3f483bab87c099957b1f0348f6241ca9e678 data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_ores_iron.json +7913fb007d2c30e49d1d3ad53eea56005e6d1c4c data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_raw_materials_iron.json +46a2b8381f6dfd925fb73e8376db7f3cc7e0eeca data/theurgy/recipes/liquefaction/alchemical_sulfur_lapis_from_gems_lapis.json +f4f2f9ad19059d349c8cedf3993a2f5aa9b0691a data/theurgy/recipes/liquefaction/alchemical_sulfur_lapis_from_ores_lapis.json +d2f05c8f7ed446f8c16e06fcfe80c77ea3462122 data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_ingots_lead.json +fd9b7dc033e1bad0663fc4d3b49416296feda645 data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_ores_lead.json +d1ebbf53aa89169274049b95fd72abb548c8c2a1 data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_raw_materials_lead.json +d36cec4da04a0fc4a902e0a05023337c59c9ba7f data/theurgy/recipes/liquefaction/alchemical_sulfur_logs_from_logs.json +b000cbf66989b8d8f4f2550f3acbb4a584017610 data/theurgy/recipes/liquefaction/alchemical_sulfur_netherite_from_ingots_netherite.json +8ebabd12e540a1c00e349723b26cb1ba9dba35d1 data/theurgy/recipes/liquefaction/alchemical_sulfur_netherite_from_ores_netherite_scrap.json +33a51a917dc132f64a240690630f1b431251c9ff data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_ingots_nickel.json +614381060e4d955ec6eb2f0b1e6e4d77919b5794 data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_ores_nickel.json +ef246579edd10622048e6d258553ae30cc1a880a data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_raw_materials_nickel.json +ee6e46c3d417641504d8bd8c056ce38a0eb1a932 data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_ingots_osmium.json +eb095a346959768b392e2a7cf6b119ee0f961cde data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_ores_osmium.json +3746351a55f165fb5465f4c695f47c19a8ec2ecb data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_raw_materials_osmium.json +0b109b9c3cfa5224ed9e3b34a675bd6fb4fa3eee data/theurgy/recipes/liquefaction/alchemical_sulfur_peridot_from_gems_peridot.json +eeffedf4bff470ffb727e52621406186cc1726b3 data/theurgy/recipes/liquefaction/alchemical_sulfur_peridot_from_ores_peridot.json +32e4a5519acac090e4f8f222f03e6e65542974d3 data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_ingots_platinum.json +44650dc24e12901f7cafec4f47071a2d51925bfa data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_ores_platinum.json +62bf22e5bbf66e6ac69da8474be9ef0f53002b4b data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_raw_materials_platinum.json +e7d408830588bbdab708da98fab92d9074db4db4 data/theurgy/recipes/liquefaction/alchemical_sulfur_prismarine_from_gems_prismarine.json +3b5e47c4184a3efb4f364a0e094e5dbe7fbcf86e data/theurgy/recipes/liquefaction/alchemical_sulfur_quartz_from_gems_quartz.json +6f0bea202d7ac9c5ee73f00ed7b3b8033faae8a2 data/theurgy/recipes/liquefaction/alchemical_sulfur_quartz_from_ores_quartz.json +343401d655fae6c8c626a58d792c077a0bdf1332 data/theurgy/recipes/liquefaction/alchemical_sulfur_redstone_from_dusts_redstone.json +b08662c4023203b2121895fa39f655cfd3fba6cd data/theurgy/recipes/liquefaction/alchemical_sulfur_redstone_from_ores_redstone.json +2a93f4e1610a6ee70199e250f58654af0a1ea3e2 data/theurgy/recipes/liquefaction/alchemical_sulfur_ruby_from_gems_ruby.json +9fbe2c393f7285aad5891eae8c9cb3ed907eddd1 data/theurgy/recipes/liquefaction/alchemical_sulfur_ruby_from_ores_ruby.json +32617508af4577a311c40c74b82e3f6eead77585 data/theurgy/recipes/liquefaction/alchemical_sulfur_sal_ammoniac_from_gems_sal_ammoniac.json +5ef52c8ccd2eb24ae88bc7ac81505bfd6d9b1a2c data/theurgy/recipes/liquefaction/alchemical_sulfur_sal_ammoniac_from_ores_sal_ammoniac.json +a8b77bab18f8b84b4eb91dd49089d2483a5baa9d data/theurgy/recipes/liquefaction/alchemical_sulfur_sapphire_from_gems_sapphire.json +c5a58725e37dc6f810fea137df5b7b36a27be927 data/theurgy/recipes/liquefaction/alchemical_sulfur_sapphire_from_ores_sapphire.json +26d92c841d50891f4650db2d6a56c9cc8fa748c0 data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_ingots_silver.json +afa39c42269b82ed796efd244b94a38540f153bb data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_ores_silver.json +68db11e27c5ac340a2ccdcfc3e1de761a79cc018 data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_raw_materials_silver.json +8d00fba0cba5d4f61890aabbb7a3d6dc86a32772 data/theurgy/recipes/liquefaction/alchemical_sulfur_sulfur_from_gems_sulfur.json +fd4c0e44e393aaea91057d872541597f3b28aa65 data/theurgy/recipes/liquefaction/alchemical_sulfur_sulfur_from_ores_sulfur.json +175c3149aceff2c255f872734b4e7f1b9173a1f4 data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_ingots_tin.json +876e7817e49d45b7b668d39c5c6369bf39798541 data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_ores_tin.json +278af395477172ed2f5e2a1fb56150e1e6a3cef5 data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_raw_materials_tin.json +68c321a8b2b5725ae626d775b5ae30f9ce6d4909 data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_ingots_unobtainium.json +03d59f1cfbc11fca5f23731d6034083957d0496d data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_ores_unobtainium.json +fc400363321aaa8ceb053ca3a0a3ab84e6247c73 data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_raw_materials_unobtainium.json +4a9bd4ebc6f604dea777944f0c60c48706853e3f data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_ingots_uranium.json +18c0c894fa86e4d49fff3d9d6525549a5694c059 data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_ores_uranium.json +b45ea6641b3775ce66a555197a9ef48c4a99355e data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_raw_materials_uranium.json +7b8e7509ee1d02bd48cd1de4443551019d2b7e9e data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_ingots_vibranium.json +d39193f50cc49655f51d3c3b90f7e51deadc4da0 data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_ores_vibranium.json +74e7f4df217d3b950f2f9e49da86e3cc1083e63f data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_raw_materials_vibranium.json +58f91f21bf741620be5acf13326bc112cc0a6c1f data/theurgy/recipes/liquefaction/alchemical_sulfur_wheat.json +267b0b555e728a372950c44fcf7bfb3b2d4ee3a2 data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_ingots_zinc.json +14a623418d56afc5034ac61851513069b4f16aff data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_ores_zinc.json +a3d90e01653021d5b6ab826582a300d12265db48 data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_raw_materials_zinc.json diff --git a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 index f4f19accb..17cd90b4d 100644 --- a/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 +++ b/src/generated/resources/.cache/c622617f6fabf890a00b9275cd5f643584a8a2c8 @@ -1,2 +1,2 @@ -// 1.20.1 2023-06-14T17:22:20.6055581 Languages: en_us -55a5390d759ca580b7f994f67afd8175953d2113 assets/theurgy/lang/en_us.json +// 1.20.1 2023-07-20T10:15:20.4499188 Languages: en_us +037d855c4f1b82fa7d6f99747d20398d842ed80b assets/theurgy/lang/en_us.json diff --git a/src/generated/resources/.cache/ccca92a6eec5aee95a4f810971c250f8552738a4 b/src/generated/resources/.cache/ccca92a6eec5aee95a4f810971c250f8552738a4 index fd7a5ad2f..8b5e5fa44 100644 --- a/src/generated/resources/.cache/ccca92a6eec5aee95a4f810971c250f8552738a4 +++ b/src/generated/resources/.cache/ccca92a6eec5aee95a4f810971c250f8552738a4 @@ -1,46 +1,138 @@ -// 1.20.1 2023-06-14T17:22:20.6035589 Item Models: theurgy -e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur.json -14a2ccdc5007ad52d74e22c1018a1a2d767df32f assets/theurgy/models/item/divination_rod_t1.json -56cbd2e62794dbad75babc62f07448c34813b99c assets/theurgy/models/item/divination_rod_t1_0.json -561e1235ed07f6cc1bbb5d36e2d85d8d467134cd assets/theurgy/models/item/divination_rod_t1_1.json -dbdc73496f0e2c1c562173def9afaa3fe6594cab assets/theurgy/models/item/divination_rod_t1_2.json -d7c53bd9d3ee54dc7063d1ac9c8ccd74b51b8bd0 assets/theurgy/models/item/divination_rod_t1_3.json -a481fc6d70d3b7d94b0ecbb522f56c67108db698 assets/theurgy/models/item/divination_rod_t1_4.json -e8c9cb3aa96ac7846ba5e43bceaf664a25824cc6 assets/theurgy/models/item/divination_rod_t1_5.json -239601888e1fbc066b825a7d71cb663b8c007796 assets/theurgy/models/item/divination_rod_t1_6.json -7bb03e19874ab49883313120fe439408807569d1 assets/theurgy/models/item/divination_rod_t1_7.json -81476c0120bc1bb7997b5af3f26f338552674c92 assets/theurgy/models/item/divination_rod_t1_searching.json -e7589ad4de37e62e5562968e698f42959cd0253b assets/theurgy/models/item/divination_rod_t2.json -761a4d6a83af1e5c5bfc189111e67cc87fe36bc7 assets/theurgy/models/item/divination_rod_t2_0.json -27556ccf6c5c5077152ee0833bfe8a154a11876a assets/theurgy/models/item/divination_rod_t2_1.json -5605b7361a8a6d3e9db3c617a5de29310cf91187 assets/theurgy/models/item/divination_rod_t2_2.json -341ff72e1ba65fcc25d9c5bd1e13d3544a36b72f assets/theurgy/models/item/divination_rod_t2_3.json -0a9948a0d1c373e18935ca423f7bad3ea32b318a assets/theurgy/models/item/divination_rod_t2_4.json -d4965cb15daf2eb892364eee41aa0f2b1c6fbce1 assets/theurgy/models/item/divination_rod_t2_5.json -e157a4b14b0d0dabdaf263adf7c450ef537daf25 assets/theurgy/models/item/divination_rod_t2_6.json -5f9f66d13968cec6c177719a88342247dbde789e assets/theurgy/models/item/divination_rod_t2_7.json -4e90369da1a091b9b187a1ca2759952963efbda3 assets/theurgy/models/item/divination_rod_t2_searching.json -fdca46746afed82443ba467547148f4c4d7b4df8 assets/theurgy/models/item/divination_rod_t3.json -c74c207dec4453af2c0be3192c155745f18e5ab3 assets/theurgy/models/item/divination_rod_t3_0.json -29ea5e52577254230bdbfe9a13abf08904ea2107 assets/theurgy/models/item/divination_rod_t3_1.json -8ae8fa89963ae4627bf44d4bd6ebb8f818163139 assets/theurgy/models/item/divination_rod_t3_2.json -4fa1c4f6dc37075d8271d437932ea06a296d3850 assets/theurgy/models/item/divination_rod_t3_3.json -319dfc39d808b3ccfaaffe237d378666d4880945 assets/theurgy/models/item/divination_rod_t3_4.json -aa58cdef692e00526bf7dead7412eeec43c0f97e assets/theurgy/models/item/divination_rod_t3_5.json -37e15311a0326611fed6f2c5b25fce14ffc022b1 assets/theurgy/models/item/divination_rod_t3_6.json -3574bf42ea614fe9c7c806770202286e29be2a96 assets/theurgy/models/item/divination_rod_t3_7.json -564f9d68d842034cd429084494fe900b849ccd57 assets/theurgy/models/item/divination_rod_t3_searching.json -ef87ecd4c9ddd1788448af6731e87c7aaa5ef713 assets/theurgy/models/item/divination_rod_t4.json -b95a478b24da791ae7c255e72a3370ee5f9b25c0 assets/theurgy/models/item/divination_rod_t4_0.json -96f5bad4dc75ecce2fd64ee27ca9f3ad861cad72 assets/theurgy/models/item/divination_rod_t4_1.json -ea7358fbb5bc502d969d9b56ad9a90fa67d369db assets/theurgy/models/item/divination_rod_t4_2.json -760d6647521ac9bd91ce7d333b2013cfea6d1a12 assets/theurgy/models/item/divination_rod_t4_3.json -afed8e3d6ecfd5ae2c9351ab528451080fa44382 assets/theurgy/models/item/divination_rod_t4_4.json -02160294e7bc7530e876fef3fce5db741df8b22a assets/theurgy/models/item/divination_rod_t4_5.json -46d1626a0c27280cbf141421f5134c2b02e7de7b assets/theurgy/models/item/divination_rod_t4_6.json -3237ccbf7ab79080fd9769cf3adea5e69c615619 assets/theurgy/models/item/divination_rod_t4_7.json -ea3053a9add02634af5fd7d9aef50801c48b32b2 assets/theurgy/models/item/divination_rod_t4_searching.json +// 1.20.1 2023-06-24T17:38:47.4549394 Item Models: theurgy +a402a05d887ec6d271a9350944338d29e1233318 assets/theurgy/models/item/alchemical_salt.json +9fd173e362b6644716da98ba0d15809f85879e78 assets/theurgy/models/item/alchemical_salt_crops.json +9fd173e362b6644716da98ba0d15809f85879e78 assets/theurgy/models/item/alchemical_salt_mineral.json +9fd173e362b6644716da98ba0d15809f85879e78 assets/theurgy/models/item/alchemical_salt_strata.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_allthemodium.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_amethyst.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_apatite.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_azure_silver.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_cinnabar.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_coal.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_copper.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_crimson_iron.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_diamond.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_emerald.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_fluorite.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_gold.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_iridium.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_iron.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_lapis.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_lead.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_logs.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_netherite.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_nickel.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_osmium.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_peridot.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_platinum.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_prismarine.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_quartz.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_redstone.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_ruby.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_sal_ammoniac.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_sapphire.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_silver.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_sulfur.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_tin.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_unobtainium.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_uranium.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_vibranium.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_wheat.json +e0f7b66a84e6588f01abbbce75b1803ffe5d46e2 assets/theurgy/models/item/alchemical_sulfur_zinc.json +f3e1291d9c55815770b5ac20d5ab61f08fcde8dc assets/theurgy/models/item/amethyst_divination_rod.json +81eabccfd42aa89df84bc6983a7acc805f6b10dd assets/theurgy/models/item/amethyst_divination_rod/0.json +3a8901bdc3e51a215197adcd0eb9a1f419eb8982 assets/theurgy/models/item/amethyst_divination_rod/1.json +910eafa0fa0d5c2051ad1b1375baeafae570b3f8 assets/theurgy/models/item/amethyst_divination_rod/2.json +5ba98234727fd2ef3e49de1ec73d1cc43023bc92 assets/theurgy/models/item/amethyst_divination_rod/3.json +fba86b4d10abdba96978b1812ddde54605971db2 assets/theurgy/models/item/amethyst_divination_rod/4.json +9450dfe940992946522440d64ce8595317c655b4 assets/theurgy/models/item/amethyst_divination_rod/5.json +68dd998da8da3176b9d5b006faa94224fa6066eb assets/theurgy/models/item/amethyst_divination_rod/6.json +2aba39038b1fa44bc0a7c915a8b164049c97dd82 assets/theurgy/models/item/amethyst_divination_rod/7.json +423f81275242e10e1e3690abb05b6ed04086f9bb assets/theurgy/models/item/amethyst_divination_rod/searching.json +a544904dc7c08099dacc58898f0b16a21fca8e35 assets/theurgy/models/item/divination_rod_t1.json +56cbd2e62794dbad75babc62f07448c34813b99c assets/theurgy/models/item/divination_rod_t1/0.json +561e1235ed07f6cc1bbb5d36e2d85d8d467134cd assets/theurgy/models/item/divination_rod_t1/1.json +dbdc73496f0e2c1c562173def9afaa3fe6594cab assets/theurgy/models/item/divination_rod_t1/2.json +d7c53bd9d3ee54dc7063d1ac9c8ccd74b51b8bd0 assets/theurgy/models/item/divination_rod_t1/3.json +a481fc6d70d3b7d94b0ecbb522f56c67108db698 assets/theurgy/models/item/divination_rod_t1/4.json +e8c9cb3aa96ac7846ba5e43bceaf664a25824cc6 assets/theurgy/models/item/divination_rod_t1/5.json +239601888e1fbc066b825a7d71cb663b8c007796 assets/theurgy/models/item/divination_rod_t1/6.json +7bb03e19874ab49883313120fe439408807569d1 assets/theurgy/models/item/divination_rod_t1/7.json +81476c0120bc1bb7997b5af3f26f338552674c92 assets/theurgy/models/item/divination_rod_t1/searching.json +b22d41093cafb7912197f176fbc6151066a7cd89 assets/theurgy/models/item/divination_rod_t2.json +761a4d6a83af1e5c5bfc189111e67cc87fe36bc7 assets/theurgy/models/item/divination_rod_t2/0.json +27556ccf6c5c5077152ee0833bfe8a154a11876a assets/theurgy/models/item/divination_rod_t2/1.json +5605b7361a8a6d3e9db3c617a5de29310cf91187 assets/theurgy/models/item/divination_rod_t2/2.json +341ff72e1ba65fcc25d9c5bd1e13d3544a36b72f assets/theurgy/models/item/divination_rod_t2/3.json +0a9948a0d1c373e18935ca423f7bad3ea32b318a assets/theurgy/models/item/divination_rod_t2/4.json +d4965cb15daf2eb892364eee41aa0f2b1c6fbce1 assets/theurgy/models/item/divination_rod_t2/5.json +e157a4b14b0d0dabdaf263adf7c450ef537daf25 assets/theurgy/models/item/divination_rod_t2/6.json +5f9f66d13968cec6c177719a88342247dbde789e assets/theurgy/models/item/divination_rod_t2/7.json +4e90369da1a091b9b187a1ca2759952963efbda3 assets/theurgy/models/item/divination_rod_t2/searching.json +e43887489024cacb8eedc9b07a24da8c28efbefa assets/theurgy/models/item/divination_rod_t3.json +c74c207dec4453af2c0be3192c155745f18e5ab3 assets/theurgy/models/item/divination_rod_t3/0.json +29ea5e52577254230bdbfe9a13abf08904ea2107 assets/theurgy/models/item/divination_rod_t3/1.json +8ae8fa89963ae4627bf44d4bd6ebb8f818163139 assets/theurgy/models/item/divination_rod_t3/2.json +4fa1c4f6dc37075d8271d437932ea06a296d3850 assets/theurgy/models/item/divination_rod_t3/3.json +319dfc39d808b3ccfaaffe237d378666d4880945 assets/theurgy/models/item/divination_rod_t3/4.json +aa58cdef692e00526bf7dead7412eeec43c0f97e assets/theurgy/models/item/divination_rod_t3/5.json +37e15311a0326611fed6f2c5b25fce14ffc022b1 assets/theurgy/models/item/divination_rod_t3/6.json +3574bf42ea614fe9c7c806770202286e29be2a96 assets/theurgy/models/item/divination_rod_t3/7.json +564f9d68d842034cd429084494fe900b849ccd57 assets/theurgy/models/item/divination_rod_t3/searching.json +ca54f619f26f5d4ded96d2e6c8dc9411a8f17738 assets/theurgy/models/item/divination_rod_t4.json +b95a478b24da791ae7c255e72a3370ee5f9b25c0 assets/theurgy/models/item/divination_rod_t4/0.json +96f5bad4dc75ecce2fd64ee27ca9f3ad861cad72 assets/theurgy/models/item/divination_rod_t4/1.json +ea7358fbb5bc502d969d9b56ad9a90fa67d369db assets/theurgy/models/item/divination_rod_t4/2.json +760d6647521ac9bd91ce7d333b2013cfea6d1a12 assets/theurgy/models/item/divination_rod_t4/3.json +afed8e3d6ecfd5ae2c9351ab528451080fa44382 assets/theurgy/models/item/divination_rod_t4/4.json +02160294e7bc7530e876fef3fce5db741df8b22a assets/theurgy/models/item/divination_rod_t4/5.json +46d1626a0c27280cbf141421f5134c2b02e7de7b assets/theurgy/models/item/divination_rod_t4/6.json +3237ccbf7ab79080fd9769cf3adea5e69c615619 assets/theurgy/models/item/divination_rod_t4/7.json +ea3053a9add02634af5fd7d9aef50801c48b32b2 assets/theurgy/models/item/divination_rod_t4/searching.json e0d7667ce794b40e193ecf66945c505733faf3f8 assets/theurgy/models/item/empty_jar.json c7428fa39a7d54d5b732ad9dbe9f78ac26eb0f85 assets/theurgy/models/item/empty_jar_labeled.json 94bfa4f4e6caf28d6f20cee65ac10387f5b115e2 assets/theurgy/models/item/jar_label.json +dba6c70f6dc6e3efa9e5ca587d452b81421cabe2 assets/theurgy/models/item/mercury_crystal.json +022666f33be76a64adeafdb25b8955238da6ad02 assets/theurgy/models/item/mercury_shard.json +8409e0681b5a4381d0c9797935b8ff63d0af9fb9 assets/theurgy/models/item/sal_ammoniac_crystal.json +8cfa468ed4afa56fc4923a5347f7cbfe60795a3b assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant.json +66a71323a5ad5f6b6d271de59a9ad997b0835c04 assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/0.json +a3ec19c883834a41d3dbdbf96f3ffb5c4062f6fb assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/1.json +566227e7dc4ab4b29d40474c77090dd6add12971 assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/2.json +ca08fd51a37953367c451d15337dc201262f747c assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/3.json +9c4a225d07b8e410d231f9c6fbe4e8d5b2de4bba assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/4.json +fc2eaee56f4386a1e192fdd960a88c58b2cd67cb assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/5.json +c825202d4d870cb8703ce3c543c2954aeafe797a assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/6.json +923f12688ccbbba8db7907dbfc56502fa8d1c547 assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/7.json +0ccd0a7e734a3458d335e04d2a9b681718edabb7 assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/searching.json +6d890201fe3e662fef7ca4fadf48fcfc7ef9228f assets/theurgy/models/item/sulfur_attuned_divination_rod_common.json +9f654079a744f07b8d71cf934808e7d2155a5fa2 assets/theurgy/models/item/sulfur_attuned_divination_rod_common/0.json +df6ff5c4c782adc7ee6ebbee73fc8481e4747d91 assets/theurgy/models/item/sulfur_attuned_divination_rod_common/1.json +0fe7f188555d36cb94f2ad25f383bbce8bc6b920 assets/theurgy/models/item/sulfur_attuned_divination_rod_common/2.json +02b5ff2f7b60fa7c50da933fb3aefda1cbe3da07 assets/theurgy/models/item/sulfur_attuned_divination_rod_common/3.json +1804b77b8f4584aecf118fcab8fdc4d246ee0cd0 assets/theurgy/models/item/sulfur_attuned_divination_rod_common/4.json +8fbbcc974762be02d9d91ded905e0b232bff868b assets/theurgy/models/item/sulfur_attuned_divination_rod_common/5.json +39434f867c1fe868288225f277f139d83b4fb277 assets/theurgy/models/item/sulfur_attuned_divination_rod_common/6.json +876563d0f6340a0cb7f56efd65eccc5520f55bd0 assets/theurgy/models/item/sulfur_attuned_divination_rod_common/7.json +2a76e1d1e3d5be4fa6aa2ab9975c8cc7a8890dd1 assets/theurgy/models/item/sulfur_attuned_divination_rod_common/searching.json +39cf7cc24920f76ca50241afbd75cdba52b7bac6 assets/theurgy/models/item/sulfur_attuned_divination_rod_precious.json +f95ce7f1aa83a2ef65f0164b38581227ee7cfc01 assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/0.json +871433e40ca569f2804dbb613f436c731d8ab1ff assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/1.json +efb856259cbac8042eaa362d4cd9f09a2f123797 assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/2.json +f6e4b499b2be09d2a0610a338bd728f6fa8c00e2 assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/3.json +118cf53896dc03178d172304f62e26aa99b21050 assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/4.json +8c6b4bc94bcebc0260eade679078cd17dcf71fc8 assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/5.json +c3184646b9515fbe8c6c82b4be9aa68144ec5c88 assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/6.json +43091cc6131eeac944e117813dacf22539e6e4bd assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/7.json +ba32f6646323a5c83d6ea4f84f97cd02b2767ba5 assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/searching.json +7a5bd4a4aad5e00863eacbc7433a82606a66d28e assets/theurgy/models/item/sulfur_attuned_divination_rod_rare.json +ece4756b8bf0eaf04f174abfe3d09261848f0869 assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/0.json +9a64316e6234a2b71e5c81e490469ee0418f70dd assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/1.json +b873d7e3c44a64540b595609f15b90e411acd305 assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/2.json +888c30c6ff355519d19b1c0db91afaeffe7ad12d assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/3.json +edbb3ac79b2989e98f506c49aacdf428b1f9dd64 assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/4.json +f751c2618b3bdcbed7af47a028289b2972312906 assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/5.json +01eabbf8ec0d22dd11d30fe62259b9668984eed4 assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/6.json +e324d0138cadc8d581b207b0f08a291ca67dc25b assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/7.json +480791ec23722cfc9be0901289627efd8bcb0785 assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/searching.json 0a1c9856bc73b607d7e6089acd1ba1a38198f8ab assets/theurgy/models/item/the_hermetica_icon.json diff --git a/src/generated/resources/.cache/da4b435d090fd54b98b68c176bd0c2440d43120a b/src/generated/resources/.cache/da4b435d090fd54b98b68c176bd0c2440d43120a new file mode 100644 index 000000000..125878ab3 --- /dev/null +++ b/src/generated/resources/.cache/da4b435d090fd54b98b68c176bd0c2440d43120a @@ -0,0 +1,3 @@ +// 1.20.1 2023-06-14T18:13:30.5425607 Accumulation Recipes +3966f82939b95cb148a81b44a9e58657bbcce5f5 data/theurgy/recipes/accumulation/sal_ammoniac_from_water.json +7ed44fb6bd6f1a9a0f5614d9521fd540ea00ea1b data/theurgy/recipes/accumulation/sal_ammoniac_from_water_and_sal_ammoniac_crystal.json diff --git a/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 b/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 new file mode 100644 index 000000000..ce2dcbc00 --- /dev/null +++ b/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 @@ -0,0 +1,10 @@ +// 1.20.1 2023-06-28T15:33:23.3001267 Advancements +937fa471962f64dac1efd805c942b2172ef4937a data/theurgy/advancements/book_root.json +0046a0dd636a914b2d9d1c9831c2866f7245794c data/theurgy/advancements/has_amethyst_rod.json +c534c04fdc358c4412be48e89e8f2d1e15cb907c data/theurgy/advancements/has_basic_rod.json +3891fcd0d2c8da027e5ecc9d9ded8a7059b5563b data/theurgy/advancements/has_liquefaction_cauldron.json +3549612ad667a7504dcb799158dcb2149064cb24 data/theurgy/advancements/has_precious_rod.json +b3758ee9365c2b1525d0a65b76e0bfec10982cc6 data/theurgy/advancements/has_rare_rod.json +1b85c5132a1984461f5113bd46ada0e4178bd69c data/theurgy/advancements/has_t2_rod.json +3e6614a518285c8c8f3ac83293a18c48164f45b8 data/theurgy/advancements/has_t3_rod.json +aec1040389b5a70cb057e7126bc59b70f2f11cb4 data/theurgy/advancements/has_t4_rod.json diff --git a/src/generated/resources/.cache/fc3b48494f43114fa81b57d6279cd71dde510dad b/src/generated/resources/.cache/fc3b48494f43114fa81b57d6279cd71dde510dad new file mode 100644 index 000000000..29e99838b --- /dev/null +++ b/src/generated/resources/.cache/fc3b48494f43114fa81b57d6279cd71dde510dad @@ -0,0 +1,36 @@ +// 1.20.1 2023-06-14T18:13:30.5385602 Incubation Recipes +b7a67f37a3de9fabdb54d341dfc705bf4965cdbe data/theurgy/recipes/incubation/coals_from_alchemical_sulfur_coal.json +697cb95e0936a50b735ca1cc967061e609709ca0 data/theurgy/recipes/incubation/dusts_redstone_from_alchemical_sulfur_redstone.json +e4cd4e174266055a09e7d742d5dedf8a494988af data/theurgy/recipes/incubation/gems_amethyst_from_alchemical_sulfur_amethyst.json +48c713c5e6250d3bc7f6f1475c12ef12e98792fa data/theurgy/recipes/incubation/gems_apatite_from_alchemical_sulfur_apatite.json +f4c955a678af49f9b31abf60bd8eb17882ee44d5 data/theurgy/recipes/incubation/gems_diamond_from_alchemical_sulfur_diamond.json +c751810f89f519a188589e73699e0a09ee26787e data/theurgy/recipes/incubation/gems_emerald_from_alchemical_sulfur_emerald.json +a9e8b205ee77e73f97c85496498445af37ac1251 data/theurgy/recipes/incubation/gems_fluorite_from_alchemical_sulfur_fluorite.json +9fd4e840a870f23f20237157e3f178f8900802ef data/theurgy/recipes/incubation/gems_lapis_from_alchemical_sulfur_lapis.json +f3e11a2f7de33d04d91e3352e2a280f855a3d1fd data/theurgy/recipes/incubation/gems_peridot_from_alchemical_sulfur_peridot.json +0df046a46caa7942c876f9f96d5cd3017cce8144 data/theurgy/recipes/incubation/gems_prismarine_from_alchemical_sulfur_prismarine.json +777b963a9c58b3787f3c749b5afb25def5f4bce3 data/theurgy/recipes/incubation/gems_quartz_from_alchemical_sulfur_quartz.json +4cae6d50e82cf14cdd91dbfdce1d398f250c37ee data/theurgy/recipes/incubation/gems_ruby_from_alchemical_sulfur_ruby.json +40a247bab9ede203a77037712854cd16edcd2412 data/theurgy/recipes/incubation/gems_sal_ammoniac_from_alchemical_sulfur_sal_ammoniac.json +0b3d0e51d507242d0a6a06e030778762d7880f3f data/theurgy/recipes/incubation/gems_sapphire_from_alchemical_sulfur_sapphire.json +fa3df3d82b726318e4cb2f935b397afba1cb4bdd data/theurgy/recipes/incubation/gems_sulfur_from_alchemical_sulfur_sulfur.json +90bfe01631e524cbcbe1da9063b64a9fd138ee53 data/theurgy/recipes/incubation/ingots_allthemodium_from_alchemical_sulfur_allthemodium.json +3ddb47c434e2dbf8bdd3f6de82350810ba0e2d73 data/theurgy/recipes/incubation/ingots_azure_silver_from_alchemical_sulfur_azure_silver.json +6b09b715566fecfb0c5a9c6377a7b6549b770e18 data/theurgy/recipes/incubation/ingots_cinnabar_from_alchemical_sulfur_cinnabar.json +f5a3351f39b7c76a895a17461e37db44659b6f96 data/theurgy/recipes/incubation/ingots_copper_from_alchemical_sulfur_copper.json +2b5bcbb5cc769da3638e68d683e78bcb26587d2c data/theurgy/recipes/incubation/ingots_crimson_iron_from_alchemical_sulfur_crimson_iron.json +077b60bf604a32149b45f1ae8ee52822a05f437a data/theurgy/recipes/incubation/ingots_gold_from_alchemical_sulfur_gold.json +685815986b90cc4cd46d0e438dca903ff21c9b48 data/theurgy/recipes/incubation/ingots_iridium_from_alchemical_sulfur_iridium.json +9df19b1bba74fc248549c0fb4415f4c1813b34dc data/theurgy/recipes/incubation/ingots_iron_from_alchemical_sulfur_iron.json +444efffeec1fac49ec7cbc0989961c7c184b6bf0 data/theurgy/recipes/incubation/ingots_lead_from_alchemical_sulfur_lead.json +62bca87d27c20c0c513efef2cb17bb3e4067f1b2 data/theurgy/recipes/incubation/ingots_netherite_from_alchemical_sulfur_netherite.json +2cb742bb4383f0bd0de94f025929852aabc2f263 data/theurgy/recipes/incubation/ingots_nickel_from_alchemical_sulfur_nickel.json +89959f8ba91355c3c283b5f7e2f1bb4dd4bbc8d6 data/theurgy/recipes/incubation/ingots_osmium_from_alchemical_sulfur_osmium.json +5a3abf95efef9e16b16adad85f2d2e62fb05bfe8 data/theurgy/recipes/incubation/ingots_platinum_from_alchemical_sulfur_platinum.json +5eaa1b694dce46482676aee43f69b30a058e2ac7 data/theurgy/recipes/incubation/ingots_silver_from_alchemical_sulfur_silver.json +02b32411683ebf607cd4a7d7deaafd17976dd175 data/theurgy/recipes/incubation/ingots_tin_from_alchemical_sulfur_tin.json +abb41f375d94b0b1fa5e28744080b6cc886a1ea2 data/theurgy/recipes/incubation/ingots_unobtainium_from_alchemical_sulfur_unobtainium.json +49735b964d16ef56b6aa2c8eeec7e379260835bb data/theurgy/recipes/incubation/ingots_uranium_from_alchemical_sulfur_uranium.json +f3001c19dccf4d4128e9accda95d5bb5766796f7 data/theurgy/recipes/incubation/ingots_vibranium_from_alchemical_sulfur_vibranium.json +6d35a5a84a6e5bbdda528613c6e5dc0e8793befe data/theurgy/recipes/incubation/ingots_zinc_from_alchemical_sulfur_zinc.json +9ba57198804a40d92a5871f3e9155d81377f1f61 data/theurgy/recipes/incubation/wheat.json diff --git a/src/generated/resources/assets/theurgy/blockstates/calcination_oven.json b/src/generated/resources/assets/theurgy/blockstates/calcination_oven.json new file mode 100644 index 000000000..537aaf331 --- /dev/null +++ b/src/generated/resources/assets/theurgy/blockstates/calcination_oven.json @@ -0,0 +1,16 @@ +{ + "variants": { + "half=lower,lit=false": { + "model": "theurgy:block/calcination_oven" + }, + "half=lower,lit=true": { + "model": "theurgy:block/calcination_oven" + }, + "half=upper,lit=false": { + "model": "theurgy:block/calcination_oven" + }, + "half=upper,lit=true": { + "model": "theurgy:block/calcination_oven" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/blockstates/deepslate_sal_ammoniac_ore.json b/src/generated/resources/assets/theurgy/blockstates/deepslate_sal_ammoniac_ore.json new file mode 100644 index 000000000..f5f6d996d --- /dev/null +++ b/src/generated/resources/assets/theurgy/blockstates/deepslate_sal_ammoniac_ore.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "theurgy:block/deepslate_sal_ammoniac_ore" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/blockstates/distiller.json b/src/generated/resources/assets/theurgy/blockstates/distiller.json new file mode 100644 index 000000000..fb1d3bd14 --- /dev/null +++ b/src/generated/resources/assets/theurgy/blockstates/distiller.json @@ -0,0 +1,16 @@ +{ + "variants": { + "half=lower,lit=false": { + "model": "theurgy:block/distiller" + }, + "half=lower,lit=true": { + "model": "theurgy:block/distiller" + }, + "half=upper,lit=false": { + "model": "theurgy:block/distiller" + }, + "half=upper,lit=true": { + "model": "theurgy:block/distiller" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/blockstates/incubator.json b/src/generated/resources/assets/theurgy/blockstates/incubator.json new file mode 100644 index 000000000..841430a1c --- /dev/null +++ b/src/generated/resources/assets/theurgy/blockstates/incubator.json @@ -0,0 +1,63 @@ +{ + "multipart": [ + { + "apply": { + "model": "theurgy:block/incubator_lower" + }, + "when": { + "half": "lower" + } + }, + { + "apply": { + "model": "theurgy:block/incubator_upper" + }, + "when": { + "half": "upper" + } + }, + { + "apply": { + "model": "theurgy:block/incubator_pipe", + "uvlock": true + }, + "when": { + "half": "lower", + "north": "true" + } + }, + { + "apply": { + "model": "theurgy:block/incubator_pipe", + "uvlock": true, + "y": 180 + }, + "when": { + "half": "lower", + "south": "true" + } + }, + { + "apply": { + "model": "theurgy:block/incubator_pipe", + "uvlock": true, + "y": 270 + }, + "when": { + "half": "lower", + "west": "true" + } + }, + { + "apply": { + "model": "theurgy:block/incubator_pipe", + "uvlock": true, + "y": 90 + }, + "when": { + "east": "true", + "half": "lower" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/blockstates/incubator_mercury_vessel.json b/src/generated/resources/assets/theurgy/blockstates/incubator_mercury_vessel.json new file mode 100644 index 000000000..dc9c7504d --- /dev/null +++ b/src/generated/resources/assets/theurgy/blockstates/incubator_mercury_vessel.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "theurgy:block/incubator_vessel" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/blockstates/incubator_salt_vessel.json b/src/generated/resources/assets/theurgy/blockstates/incubator_salt_vessel.json new file mode 100644 index 000000000..dc9c7504d --- /dev/null +++ b/src/generated/resources/assets/theurgy/blockstates/incubator_salt_vessel.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "theurgy:block/incubator_vessel" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/blockstates/incubator_sulfur_vessel.json b/src/generated/resources/assets/theurgy/blockstates/incubator_sulfur_vessel.json new file mode 100644 index 000000000..dc9c7504d --- /dev/null +++ b/src/generated/resources/assets/theurgy/blockstates/incubator_sulfur_vessel.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "theurgy:block/incubator_vessel" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/blockstates/liquefaction_cauldron.json b/src/generated/resources/assets/theurgy/blockstates/liquefaction_cauldron.json new file mode 100644 index 000000000..550a103f5 --- /dev/null +++ b/src/generated/resources/assets/theurgy/blockstates/liquefaction_cauldron.json @@ -0,0 +1,16 @@ +{ + "variants": { + "half=lower,lit=false": { + "model": "theurgy:block/liquefaction_cauldron_lower" + }, + "half=lower,lit=true": { + "model": "theurgy:block/liquefaction_cauldron_lower" + }, + "half=upper,lit=false": { + "model": "theurgy:block/liquefaction_cauldron_upper" + }, + "half=upper,lit=true": { + "model": "theurgy:block/liquefaction_cauldron_upper" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/blockstates/pyromantic_brazier.json b/src/generated/resources/assets/theurgy/blockstates/pyromantic_brazier.json new file mode 100644 index 000000000..5579668c8 --- /dev/null +++ b/src/generated/resources/assets/theurgy/blockstates/pyromantic_brazier.json @@ -0,0 +1,10 @@ +{ + "variants": { + "lit=false": { + "model": "theurgy:block/pyromantic_brazier" + }, + "lit=true": { + "model": "theurgy:block/pyromantic_brazier_lit" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/blockstates/sal_ammoniac_accumulator.json b/src/generated/resources/assets/theurgy/blockstates/sal_ammoniac_accumulator.json new file mode 100644 index 000000000..9803d1c3e --- /dev/null +++ b/src/generated/resources/assets/theurgy/blockstates/sal_ammoniac_accumulator.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "theurgy:block/sal_ammoniac_accumulator" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/blockstates/sal_ammoniac_ore.json b/src/generated/resources/assets/theurgy/blockstates/sal_ammoniac_ore.json new file mode 100644 index 000000000..cf44a4b70 --- /dev/null +++ b/src/generated/resources/assets/theurgy/blockstates/sal_ammoniac_ore.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "theurgy:block/sal_ammoniac_ore" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/blockstates/sal_ammoniac_tank.json b/src/generated/resources/assets/theurgy/blockstates/sal_ammoniac_tank.json new file mode 100644 index 000000000..612dbb5cb --- /dev/null +++ b/src/generated/resources/assets/theurgy/blockstates/sal_ammoniac_tank.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "theurgy:block/sal_ammoniac_tank" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/lang/en_us.json b/src/generated/resources/assets/theurgy/lang/en_us.json index 5702289cd..7650c5bf6 100644 --- a/src/generated/resources/assets/theurgy/lang/en_us.json +++ b/src/generated/resources/assets/theurgy/lang/en_us.json @@ -1,66 +1,512 @@ { + "block.theurgy.calcination_oven": "Calcination Oven", + "block.theurgy.calcination_oven.tooltip": "A device to extract Alchemical Salt from Items.", + "block.theurgy.calcination_oven.tooltip.extended": "Salt represents the \"body\" or \"physical matter\" of an object.", + "block.theurgy.calcination_oven.tooltip.usage": "Place this on top of a heating device such as a Pyromantic Brazier.\n§aRight-Click§r§7 with ingredients to place them in the oven for processing.\n", + "block.theurgy.deepslate_sal_ammoniac_ore": "Deepslate Sal Ammoniac Ore", + "block.theurgy.deepslate_sal_ammoniac_ore.tooltip.extended": "Ore that yields Sal Ammoniac Crystals for use in a Sal Ammoniac Accumulator.", + "block.theurgy.distiller": "Mercury Distiller", + "block.theurgy.distiller.tooltip": "A device to extract Alchemical Mercury from Items.", + "block.theurgy.distiller.tooltip.extended": "Mercury represents the \"energy\" of an object. It has applications both as an energy source and as a catalyst.", + "block.theurgy.distiller.tooltip.usage": "Place this on top of a heating device such as a Pyromantic Brazier.\n§aRight-Click§r§7 with ingredients to add them to the distiller for processing.\n", + "block.theurgy.incubator": "Incubator", + "block.theurgy.incubator.tooltip": "A device to recombine Alchemical Sulfur, Salt and Mercury into items.", + "block.theurgy.incubator.tooltip.usage": "Place this on top of a heating device such as a Pyromantic Brazier.\nNeeds Incubator Vessels for all three ingredient types adjacent horizontally to the incubator.\n", + "block.theurgy.incubator_mercury_vessel": "Incubator Mercury Vessel", + "block.theurgy.incubator_mercury_vessel.tooltip": "A vessel to hold Mercury for the Incubator.", + "block.theurgy.incubator_mercury_vessel.tooltip.usage": "Place horizontally next to the incubator.\n§aRight-Click§r§7 with Alchemical Mercury to fill the vessel to allow the Incubator to process it.\n", + "block.theurgy.incubator_salt_vessel": "Incubator Salt Vessel", + "block.theurgy.incubator_salt_vessel.tooltip": "A vessel to hold Salt for the Incubator.", + "block.theurgy.incubator_salt_vessel.tooltip.usage": "Place horizontally next to the incubator.\n§aRight-Click§r§7 with Alchemical Salt to fill the vessel to allow the Incubator to process it.\n", + "block.theurgy.incubator_sulfur_vessel": "Incubator Sulfur Vessel", + "block.theurgy.incubator_sulfur_vessel.tooltip": "A vessel to hold Sulfur for the Incubator.", + "block.theurgy.incubator_sulfur_vessel.tooltip.usage": "Place horizontally next to the incubator.\n§aRight-Click§r§7 with Alchemical Sulfur to fill the vessel to allow the Incubator to process it.\n", + "block.theurgy.liquefaction_cauldron": "Liquefaction Cauldron", + "block.theurgy.liquefaction_cauldron.tooltip": "A device to extract Alchemical Sulfur from Items using a Solvent.", + "block.theurgy.liquefaction_cauldron.tooltip.extended": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "block.theurgy.liquefaction_cauldron.tooltip.usage": "Place this on top of a heating device such as a Pyromantic Brazier.\n§aRight-Click§r§7 with ingredients to add them to the cauldron for processing.\n", + "block.theurgy.pyromantic_brazier": "Pyromantic Brazier", + "block.theurgy.pyromantic_brazier.tooltip": "A simple device to heat alchemical apparati.", + "block.theurgy.pyromantic_brazier.tooltip.extended": "Place this below other alchemical apparati to heat them up", + "block.theurgy.pyromantic_brazier.tooltip.usage": "§aRight-Click§r§7 with a fuel item to insert it (or using a hopper)", + "block.theurgy.sal_ammoniac_accumulator": "Sal Ammoniac Accumulator", + "block.theurgy.sal_ammoniac_accumulator.tooltip": "A simple device to increase the concentration of residual Sal Ammoniac in water by evaporation.", + "block.theurgy.sal_ammoniac_accumulator.tooltip.extended": "The resulting concentrated Sal Ammoniac fluid is a solvent that can be used in Liquefaction Cauldrons.", + "block.theurgy.sal_ammoniac_accumulator.tooltip.usage": "Place this on top of a heating device such as a Pyromantic Brazier.\n§aRight-Click§r§7 with water buckets to fill the accumulator.\nThe water will be consumed to fill the accumulator.\nYou can additionally add Sal Ammoniac Crystals to speed up the process.\n", + "block.theurgy.sal_ammoniac_ore": "Sal Ammoniac Ore", + "block.theurgy.sal_ammoniac_ore.tooltip.extended": "Ore that yields Sal Ammoniac Crystals for use in a Sal Ammoniac Accumulator.", + "block.theurgy.sal_ammoniac_tank": "Sal Ammoniac Tank", + "block.theurgy.sal_ammoniac_tank.tooltip": "A tank to store concentrated Sal Ammoniac fluid.", + "block.theurgy.sal_ammoniac_tank.tooltip.extended": "Sal Ammoniac is a solvent that can be used in Liquefaction Cauldrons.", + "block.theurgy.sal_ammoniac_tank.tooltip.usage": "Place this below a filled Sal Ammoniac Accumulator.\nThe Tank will slowly be filled with Sal Ammoniac.\n", + "book.theurgy.the_hermetica.getting_started.about_divination_rods.description": "An Introduction to Ore-Finding", + "book.theurgy.the_hermetica.getting_started.about_divination_rods.intro.text": "Divination Rods, also known as Dowsing Rods, are a valuable instrument used to locate ores and other valuable blocks. In order to show the location of a block, it must first be \"attuned\" to it.\n", + "book.theurgy.the_hermetica.getting_started.about_divination_rods.intro.title": "About Divination Rods", + "book.theurgy.the_hermetica.getting_started.about_divination_rods.intro2.text": "There are two methods of attuning, depending on the type of rod: by *crafting* a rod with the [](ad03fc)alchemical sulfur[](#) of the desired block, or by *using* a rod on the desired block.\n\\\n\\\nAttuning a rod to a block will cause it to point towards the nearest block of that type.\n", + "book.theurgy.the_hermetica.getting_started.about_divination_rods.intro2.title": "Rod Attunement", + "book.theurgy.the_hermetica.getting_started.about_divination_rods.name": "About Divination Rods", + "book.theurgy.the_hermetica.getting_started.about_divination_rods.sulfur_attuned_rods.text": "Pre-Attuned rods, those that are crafted with alchemical sulfur, are more stable, and thus have a much higher durability, but require more effort to craft.\n\\\n\\\nResearch [Spagyrics](entry://getting_started/spagyrics) (specifically, *Liquefaction*) to continue on this path.\n", + "book.theurgy.the_hermetica.getting_started.about_divination_rods.sulfur_attuned_rods.title": "Pre-Attuned Rods", + "book.theurgy.the_hermetica.getting_started.about_divination_rods.usage.text": "- **Shift-Click** a block to attune the rod to it (unless it is pre-attuned).\n- **Right-Click and hold** to let the rod search for blocks.\n- **Right-Click without holding** after a successful search will let the rod show the last found block without consuming durability.\n", + "book.theurgy.the_hermetica.getting_started.about_divination_rods.usage.title": "Usage", + "book.theurgy.the_hermetica.getting_started.about_divination_rods.usage2.text": "The rod will indicate that it found a block by *changing color* to be partially or fully purple, and by emitting a *glowing ball* that will fly towards the block, when right-clicked without holding.\n", + "book.theurgy.the_hermetica.getting_started.about_divination_rods.usage2.title": "Usage", "book.theurgy.the_hermetica.getting_started.about_mod.about.text": "Welcome, dear reader, to Theurgy, a mod that explores the ancient and revered art of classical alchemy. As you embark on your journey through the noble art of transformation, you will be equipped with divination rods to make finding resources in the world easier.\n", "book.theurgy.the_hermetica.getting_started.about_mod.about.title": "The Art of Alchemy", "book.theurgy.the_hermetica.getting_started.about_mod.about2.text": "Through diligent study and practice, you will then learn to use alchemical devices to refine, replicate, and transform resources into new and useful materials. Along the way, you will have the opportunity to craft alchemical devices and equipment to aid you in your endeavors.\n", + "book.theurgy.the_hermetica.getting_started.about_mod.about3.text": "As a final note, alchemists are guided by reason and logic, not superstition or magic. Our experiments are based on careful observation, meticulous record-keeping, and rigorous testing. We do not claim to possess supernatural powers, but rather seek to harness the natural forces of the world around us to achieve our goals.\n", "book.theurgy.the_hermetica.getting_started.about_mod.description": "About this Mod", - "book.theurgy.the_hermetica.getting_started.about_mod.features.text": "- Divination rods to find ores\n- Future: Ore refining (= more ingots per ore)\n- Future: Item replication (create duplicates of items you have)\n- Future: Item transformation (create new items from other items)\n", + "book.theurgy.the_hermetica.getting_started.about_mod.features.text": "- Divination rods to find ores\n- Ore refining (= more ingots per ore/raw metal)\n- Future: Item replication (create duplicates of items you have)\n- Future: Item transformation (create new items from other items)\n", "book.theurgy.the_hermetica.getting_started.about_mod.features.title": "Features", - "book.theurgy.the_hermetica.getting_started.about_mod.features2.text": "- Future: Weapons and Equipment\n- Future: Devices to assist in common tasks\n", + "book.theurgy.the_hermetica.getting_started.about_mod.features2.text": "- Future: Item Transportation\n- Future: Weapons and Equipment\n- Future: Devices to assist in common tasks\n", "book.theurgy.the_hermetica.getting_started.about_mod.features2.title": "More Features", "book.theurgy.the_hermetica.getting_started.about_mod.name": "The Art of Alchemy", - "book.theurgy.the_hermetica.getting_started.divination_rod.description": "An Introduction to Ore-Finding", - "book.theurgy.the_hermetica.getting_started.divination_rod.intro.text": "As a novice alchemist, it is important to familiarize yourself with the various tools and techniques at your disposal. One such tool is the divination rod, a valuable instrument used to locate hidden ores in the world.\n", - "book.theurgy.the_hermetica.getting_started.divination_rod.intro2.text": " By attuning your senses and your rod to the elemental energies present in the earth, you can detect the presence of ore deposits and guide yourself to their location. With practice, the use of divination rods can greatly aid you in your quest for the resources necessary for your alchemical pursuits.\n", - "book.theurgy.the_hermetica.getting_started.divination_rod.name": "Divination Rods", - "book.theurgy.the_hermetica.getting_started.divination_rod.recipe.text": "The most basic tier of divination rods, brittle and limited in it's application, but powerful nonetheless.\n", - "book.theurgy.the_hermetica.getting_started.divination_rod.supported_blocks.text": "Rods can be attuned to a wide variety of useful blocks, including various types of ores and wood. Basic divination rods will be sufficient to locate common ores such as [iron](item://minecraft:iron_ore) or [coal](item://minecraft:coal_ore), but more rare and precious materials such as [diamonds](item://minecraft:diamond_ore) will require a higher tier rod to detect.\n", - "book.theurgy.the_hermetica.getting_started.divination_rod.supported_blocks.title": "Attunable Materials", - "book.theurgy.the_hermetica.getting_started.divination_rod.usage.text": "- **Shift-Click** a block to attune the rod to it.\n- **Right-Click and hold** to let the rod search for blocks.\n- **\"Right-Click without holding**: after a successful search to let the rod show the last found block without consuming durability.\n", - "book.theurgy.the_hermetica.getting_started.divination_rod.usage.title": "Usage", + "book.theurgy.the_hermetica.getting_started.about_ore_refining.cost.text": "To bring it to a point, the cost of significantly increasing ore yield with Spagyrics is having to obtain high amounts of [Mineral Salt](item://theurgy:alchemical_salt_mineral) which is mainly sourced from ... Metals.\n", + "book.theurgy.the_hermetica.getting_started.about_ore_refining.cost.title": "The Cost", + "book.theurgy.the_hermetica.getting_started.about_ore_refining.cost2.text": "The first and obvious solution to this chicken-and-egg problem is to [calcinate](entry://spagyrics/calcination_oven) abundant metals, such as [](item://minecraft:raw_copper), and use the salt to [incubate](entry://spagyrics/incubator) more valuable materials such as [](item://minecraft:iron_ingot) or even [](item://minecraft:diamond) as output.\n", + "book.theurgy.the_hermetica.getting_started.about_ore_refining.cost2.title": "The Cost", + "book.theurgy.the_hermetica.getting_started.about_ore_refining.description": "Triple your ore yield - at a cost!", + "book.theurgy.the_hermetica.getting_started.about_ore_refining.intro.text": "In the following pages and entries we will attempt to create three iron ingots out of just one iron ore using alchemical processes.\n", + "book.theurgy.the_hermetica.getting_started.about_ore_refining.intro.title": "Ore Duplication", + "book.theurgy.the_hermetica.getting_started.about_ore_refining.intro2.text": "The easiest application of Spagyrics is the refining of ores and raw metals. The process of smelting ores in a furnace is wasteful, as it only yields a single ingot per ore, losing a lot of the precious raw materials in the process. Alchemists can extract even the last iota of value from ores, but the process is somewhat more complex.\n", + "book.theurgy.the_hermetica.getting_started.about_ore_refining.intro2.title": "Spagyrics for Refining", + "book.theurgy.the_hermetica.getting_started.about_ore_refining.name": "Ore Refining", + "book.theurgy.the_hermetica.getting_started.about_ore_refining.next.text": "The next entries will guide you through the process of obtaining all the materials and creating your iron ingots.\n", + "book.theurgy.the_hermetica.getting_started.about_ore_refining.next.title": "Further Reading", + "book.theurgy.the_hermetica.getting_started.about_ore_refining.overview.text": "To refine an Ore or Raw Metal you first need to [liquefy](entry://spagyrics/liquefaction_cauldron) it, which will yield multiple Ore Sulfur. Additionally you need to obtain multiple heaps of [Mineral Salt](item://theurgy:alchemical_salt_mineral) to provide a body for this multiplied Sulfur, and some [Mercury Shards](item://theurgy:mercury_shard) to provide the mercury for the soul of the resulting refined ingots.\n", + "book.theurgy.the_hermetica.getting_started.about_ore_refining.overview.title": "The Process", + "book.theurgy.the_hermetica.getting_started.about_ore_refining.silver_lining.text": "As luck would have it another option to obtain [Mineral Salt](item://theurgy:alchemical_salt_mineral) is to calcinate it from [Strata Salt](item://theurgy:alchemical_salt_strata), which is in turn obtained by calcinating Sand, Cobblestone, etc. This is a somewhat lossy process as it requires a lot of [Strata Salt](item://theurgy:alchemical_salt_strata), but it does have the upside of giving those abundant materials a use.\n", + "book.theurgy.the_hermetica.getting_started.about_ore_refining.silver_lining.title": "The Silver Lining", + "book.theurgy.the_hermetica.getting_started.about_ore_refining.soul.text": "Obtaining [](item://theurgy:mercury_shard) is usually not much of an issue as a wide variety of materials can be [distilled](entry://spagyrics/distiller) to obtain in.\n", + "book.theurgy.the_hermetica.getting_started.about_ore_refining.soul.title": "The Soul", + "book.theurgy.the_hermetica.getting_started.abundant_and_common_sulfur_attuned_divination_rod.description": "Pre-attuned rods for locating abundant and common ores.", + "book.theurgy.the_hermetica.getting_started.abundant_and_common_sulfur_attuned_divination_rod.intro.text": "This divination rod is the most basic variant of pre-attuned rod. While it cannot be attuned to a new block after crafting, it has a much higher durability, and is generally more convenient to use.\n", + "book.theurgy.the_hermetica.getting_started.abundant_and_common_sulfur_attuned_divination_rod.name": "Basic Sulfur-Attuned Divination Rods", + "book.theurgy.the_hermetica.getting_started.abundant_and_common_sulfur_attuned_divination_rod.recipe_abundant.text": "A rod pre-attuned to abundant ores, such as [copper](item://minecraft:copper_ore) or [coal](item://minecraft:coal_ore).\n", + "book.theurgy.the_hermetica.getting_started.abundant_and_common_sulfur_attuned_divination_rod.recipe_common.text": "A rod pre-attuned to common ores, such as [iron](item://minecraft:iron_ore) or [lapis](item://minecraft:lapis_ore).\n", + "book.theurgy.the_hermetica.getting_started.abundant_and_common_sulfur_attuned_divination_rod.sulfur.text": "To obtain sulfur for crafting this rod you first need to obtain an ore, ingot or gem of the type of material you want the rod to be attuned to. Then, you need to obtain it's sulfur by melting it down in a [Liquefaction Cauldron](entry://spagyrics/liquefaction_cauldron).\n", + "book.theurgy.the_hermetica.getting_started.abundant_and_common_sulfur_attuned_divination_rod.sulfur.title": "Sulfur", + "book.theurgy.the_hermetica.getting_started.amethyst_divination_rod.description": "A pre-attuned rod to find budding amethyst blocks.", + "book.theurgy.the_hermetica.getting_started.amethyst_divination_rod.intro.text": "Crystals are especially useful for attuning divination rods, and many more advanced rod designs require [amethyst shards](item://minecraft:amethyst_shard) specifically. This rod is pre-attuned to locate budding amethyst blocks to make it easier to obtain these helpful crystals.\n", + "book.theurgy.the_hermetica.getting_started.amethyst_divination_rod.name": "Amethyst Divination Rod", + "book.theurgy.the_hermetica.getting_started.amethyst_divination_rod.recipe.text": "A pre-attuned rod that only finds [amethyst](item://minecraft:budding_amethyst).\n", + "book.theurgy.the_hermetica.getting_started.apparatus_how_to.automatic_interaction.text": "Automatic interactions also use a standardized pattern.\n\\\n\\\n**Input** slots can be accessed from the **top**, while **output** slots are available at the **bottom**.\\\n\\\nA **combined inventory** can be found at the horizontal **sides**.\n", + "book.theurgy.the_hermetica.getting_started.apparatus_how_to.automatic_interaction.title": "Automatic Interaction", + "book.theurgy.the_hermetica.getting_started.apparatus_how_to.description": "How to interact with the tools of the trade", + "book.theurgy.the_hermetica.getting_started.apparatus_how_to.fluid_interaction.text": "If you click on an apparatus with a filled fluid container in your hand, it will try to empty the container into the device.\n\\\n\\\nIf you click on an apparatus with an empty fluid container in your hand, it will instead try to fill the container from the device.\n", + "book.theurgy.the_hermetica.getting_started.apparatus_how_to.fluid_interaction.title": "Fluids", + "book.theurgy.the_hermetica.getting_started.apparatus_how_to.intro.text": "Alchemist use a variety of tools and devices to aid them in their work. These devices are collectively referred to as apparatus.\n\\\n\\\nIt is important to understand that each apparatus should only have one specific function, such as generating heat or melting items.\n", + "book.theurgy.the_hermetica.getting_started.apparatus_how_to.intro.title": "Alchemical Apparatus", + "book.theurgy.the_hermetica.getting_started.apparatus_how_to.intro2.text": "By adhering to this principle, we can create a modular system that allows for greater flexibility and efficiency in our work.\n\\\n\\\nFurther, all apparatus follow a standardized interaction pattern that makes it easier to use them both for manual interactions and for automation.\n", + "book.theurgy.the_hermetica.getting_started.apparatus_how_to.manual_interaction.text": "To interact with an apparatus, approach it and right-click on it.\n\\\n\\\n**Taking Output Items**\\\nIf you have an empty hand, the machine will first try to take the contents of its output slot and place them in your inventory.\n", + "book.theurgy.the_hermetica.getting_started.apparatus_how_to.manual_interaction.title": "Manual Interaction", + "book.theurgy.the_hermetica.getting_started.apparatus_how_to.manual_interaction2.text": "**Taking Input Items**\\\nIf there are no output items, it will instead try to place the contents of its input slot into your inventory, effectively emptying it.\n\\\n\\\n**Inserting Items**\\\nIf you have an item in your hand, the apparatus will automatically try to insert it into the input slot.\n", + "book.theurgy.the_hermetica.getting_started.apparatus_how_to.name": "Alchemical Apparatus", + "book.theurgy.the_hermetica.getting_started.create_mercury.description": "Obtaining Mercury - the \"Spirit\"", + "book.theurgy.the_hermetica.getting_started.create_mercury.intro.text": "Mercury is the spirit, or energy, contained within matter. Like Salt, it is needed to create items from Alchemical Sulfur. Almost all items yield Mercury, but the more valuable and the more refined the item, the more mercury they will yield.\n", + "book.theurgy.the_hermetica.getting_started.create_mercury.name": "Extracting Mercury", + "book.theurgy.the_hermetica.getting_started.create_mercury.step1.text": "Right-click the [](item://theurgy:distiller) with any mercury-yielding item, such as Crops, Food, Ores, Raw Metals, but also Stone, Sand, Glass, ...\\\nFor low-value items you may need to add multiple items at once to obtain even one [](item://theurgy:mercury_shard).\n", + "book.theurgy.the_hermetica.getting_started.create_mercury.step1.title": "Distilling Mercury", + "book.theurgy.the_hermetica.getting_started.create_mercury.step2.text": "Now add fuel, such as Coal, to the [](item://theurgy:pyromantic_brazier) below the [](item://theurgy:distiller) to heat it up.\n", + "book.theurgy.the_hermetica.getting_started.create_mercury.step2.title": "Providing Heat", + "book.theurgy.the_hermetica.getting_started.create_mercury.step3.text": "After a while some mercury shards will have been created, you can right-click the [](item://theurgy:distiller) with an empty hand to obtain [](item://theurgy:mercury_shard).\n", + "book.theurgy.the_hermetica.getting_started.create_mercury.step3.title": "Obtaining the Mercury", + "book.theurgy.the_hermetica.getting_started.create_salt.description": "Obtaining Salt - the \"Body\"", + "book.theurgy.the_hermetica.getting_started.create_salt.intro.text": "Salt is needed in order to create items from Alchemical Sulfur. The type of salt needs to match the type of sulfur - for our project that involves [Iron Sulfur](item://theurgy:alchemical_sulfur_iron) we need [Mineral Salt](item://theurgy:alchemical_salt_mineral), which covers all types of ores and metals.\n", + "book.theurgy.the_hermetica.getting_started.create_salt.name": "Extracting Salt", + "book.theurgy.the_hermetica.getting_started.create_salt.step1.text": "Right-click the [](item://theurgy:calcination_oven) with any Mineral such as Ores, Raw Metals or Ingots to calcinate it.\nOne option is to use a Stack of [Strata Salt](item://theurgy:alchemical_salt_strata), which in turn is calcinated from Stone, Sand, Gravel, Dirt, etc.\nAnother great source is [](item://minecraft:charcoal), as it is renewable.\n", + "book.theurgy.the_hermetica.getting_started.create_salt.step1.title": "Calcinating Minerals", + "book.theurgy.the_hermetica.getting_started.create_salt.step2.text": "Now add fuel, such as Coal, to the [](item://theurgy:pyromantic_brazier) below the [](item://theurgy:calcination_oven) to heat it up.\n", + "book.theurgy.the_hermetica.getting_started.create_salt.step2.title": "Providing Heat", + "book.theurgy.the_hermetica.getting_started.create_salt.step3.text": "After a while some salt will have been created, you can right-click the [](item://theurgy:calcination_oven) with an empty hand to obtain [Mineral Salt](item://theurgy:alchemical_salt_mineral).\n", + "book.theurgy.the_hermetica.getting_started.create_salt.step3.title": "Obtaining the Salt", + "book.theurgy.the_hermetica.getting_started.create_solvent.description": "Obtaining Sal Ammoniac - they key to Sulfur Extraction", + "book.theurgy.the_hermetica.getting_started.create_solvent.intro.text": "There are two ways of obtaining Sal Ammoniac, both use the Accumulator Apparatus. The first, slower, option is to simply place water in the accumulator, and let it slowly concentrate the inherently contained Sal Ammoniac. The second, faster, option is to additionally add a [](item://theurgy:sal_ammoniac_crystal) to speed up the process significantly.\n", + "book.theurgy.the_hermetica.getting_started.create_solvent.name": "Accumulating Solvent", + "book.theurgy.the_hermetica.getting_started.create_solvent.step1.text": "After placing the [](item://theurgy:sal_ammoniac_accumulator) on a [](item://theurgy:sal_ammoniac_tank), right-click the [](item://theurgy:sal_ammoniac_accumulator) with water buckets (up to 10) to fill it.\n", + "book.theurgy.the_hermetica.getting_started.create_solvent.step1.title": "Filling the Accumulator", + "book.theurgy.the_hermetica.getting_started.create_solvent.step2.text": "Optionally you can now right-click the [](item://theurgy:sal_ammoniac_accumulator) with a [](item://theurgy:sal_ammoniac_crystal) (obtained by mining). You will get Sal Ammoniac regardless, but the crystal will speed up the process significantly.\n", + "book.theurgy.the_hermetica.getting_started.create_solvent.step2.title": "Adding Crystals", + "book.theurgy.the_hermetica.getting_started.create_solvent.step3.text": "Once the [](item://theurgy:sal_ammoniac_tank) has filled up sufficiently, you can right-click it with an empty bucket to obtain a [](item://theurgy:sal_ammoniac_bucket).\n", + "book.theurgy.the_hermetica.getting_started.create_solvent.step3.title": "Obtaining the Sal Ammoniac", + "book.theurgy.the_hermetica.getting_started.create_sulfur.description": "Obtaining Sulfur - the \"Soul\"", + "book.theurgy.the_hermetica.getting_started.create_sulfur.intro.text": "Sulfur extraction is the part of ore purification that leads to [#](ad03fc)multiplication[#](). One Ore or Raw Metal yields multiple sulfurs, which then each can be refined into an ingot.\n", + "book.theurgy.the_hermetica.getting_started.create_sulfur.name": "Extracting Sulfur", + "book.theurgy.the_hermetica.getting_started.create_sulfur.step1.text": "Right-click the [](item://theurgy:liquefaction_cauldron) with a [](item://theurgy:sal_ammoniac_bucket) to fill it.\n", + "book.theurgy.the_hermetica.getting_started.create_sulfur.step1.title": "Filling the Liquefaction Cauldron", + "book.theurgy.the_hermetica.getting_started.create_sulfur.step2.text": "Now right-click the [](item://theurgy:liquefaction_cauldron) with the item you want to extract sulfur from, such as [](item://minecraft:raw_iron). The item will be placed inside.\n", + "book.theurgy.the_hermetica.getting_started.create_sulfur.step2.title": "Adding Raw Materials", + "book.theurgy.the_hermetica.getting_started.create_sulfur.step3.text": "Now add fuel, such as Coal, to the [](item://theurgy:pyromantic_brazier) below the [](item://theurgy:liquefaction_cauldron) to heat it up.\n", + "book.theurgy.the_hermetica.getting_started.create_sulfur.step3.title": "Providing Heat", + "book.theurgy.the_hermetica.getting_started.create_sulfur.step4.text": "After a while some sulfur will have been extracted, you can right-click the [](item://theurgy:liquefaction_cauldron) with an empty hand to obtain [Alchemical Sulfur](item://theurgy:alchemical_sulfur_iron).\n", + "book.theurgy.the_hermetica.getting_started.create_sulfur.step4.title": "Obtaining the Sulfur", + "book.theurgy.the_hermetica.getting_started.incubation.description": "Creating Iron Ingots from Sulfur, Salt and Mercury", + "book.theurgy.the_hermetica.getting_started.incubation.intro.text": "The final step is to recombine the three principles into usable Iron Ingots.\n", + "book.theurgy.the_hermetica.getting_started.incubation.intro.title": "Incubating Iron", + "book.theurgy.the_hermetica.getting_started.incubation.name": "Incubating Iron", + "book.theurgy.the_hermetica.getting_started.incubation.step1.text": "Right-click the [](item://theurgy:incubator_sulfur_vessel), [](item://theurgy:incubator_salt_vessel) and [](item://theurgy:incubator_mercury_vessel) with the Sulfur, Salt and Mercury you obtained earlier respectively to fill them.\n", + "book.theurgy.the_hermetica.getting_started.incubation.step1.title": "Filling the Vessels", + "book.theurgy.the_hermetica.getting_started.incubation.step2.text": "Now add fuel, such as Coal, to the [](item://theurgy:pyromantic_brazier) below the [](item://theurgy:incubator) to heat it up.\n", + "book.theurgy.the_hermetica.getting_started.incubation.step2.title": "Providing Heat", + "book.theurgy.the_hermetica.getting_started.incubation.step3.text": "After a while the input items will have been consumed and incubated into the result, you can right-click the [](item://theurgy:incubator) with an empty hand to obtain 3x [](item://minecraft:iron_ingot).\n\\\n\\\n**Congratulations, you created 3 Ingots from one Raw Metal!**\n", + "book.theurgy.the_hermetica.getting_started.incubation.step3.title": "Obtaining the Incubated Item", "book.theurgy.the_hermetica.getting_started.intro.description": "About using The Hermetica", - "book.theurgy.the_hermetica.getting_started.intro.help.text": "If the reader finds themselves in trouble of any kind, prompt assistance will be provided at the Council of Alchemists, known also as Kli Kli's Discord Server.\n\\\n\\\n[To get help, join us at https://dsc.gg/klikli](https://discord.gg/trE4SHRXvb)\n", + "book.theurgy.the_hermetica.getting_started.intro.help.text": "If the reader finds themselves in trouble of any kind, prompt assistance will be provided at the Council of Alchemists, known also as Kli Kli's Discord Server.\n\\\n\\\n[To get help, join us at https://invite.gg/klikli](https://invite.gg/klikli)\n", "book.theurgy.the_hermetica.getting_started.intro.help.title": "Seeking Counsel", "book.theurgy.the_hermetica.getting_started.intro.intro.text": "The following pages will lead the novice alchemist on their journey through the noble art of the transformation of matter and mind. This humble author will share their experiences, thoughts and research notes to guide the valued reader in as safe a manner as the subject matter allows.\n", "book.theurgy.the_hermetica.getting_started.intro.intro.title": "About this Work", "book.theurgy.the_hermetica.getting_started.intro.name": "About this Work", "book.theurgy.the_hermetica.getting_started.name": "Getting Started", + "book.theurgy.the_hermetica.getting_started.needed_apparatus.calcination_oven.text": "The Calcination Oven will allow you to create the [Mineral Salt](item://theurgy:alchemical_salt_mineral).\n", + "book.theurgy.the_hermetica.getting_started.needed_apparatus.description": "Tools for Refinement", + "book.theurgy.the_hermetica.getting_started.needed_apparatus.distiller.text": "The Distiller creates [Mercury Shards](item://theurgy:mercury_shard).\n", + "book.theurgy.the_hermetica.getting_started.needed_apparatus.incubator.text": "Finally, the incubator recombines the Salt, Sulfur, and Mercury into the refined item, Iron Ingots in our case.\nIt needs one each of [Salt Vessel](item://theurgy:incubator_salt_vessel), [Mercury Vessel](item://theurgy:incubator_mercury_vessel), [Sulfur Vessel](item://theurgy:incubator_sulfur_vessel) to hold the input materials.\n", + "book.theurgy.the_hermetica.getting_started.needed_apparatus.intro.text": "Ore Refining needs all of the Spagyrics Apparatus to extract all the needed materials and recombine them.\nReview the full [Spagyrics](category://spagyrics) Category on how to craft and use them.\n", + "book.theurgy.the_hermetica.getting_started.needed_apparatus.intro.title": "Required Apparatus", + "book.theurgy.the_hermetica.getting_started.needed_apparatus.liquefaction_cauldron.text": "The Liquefaction Cauldron uses Sal Ammoniac to extract Alchemical Sulfur.\n", + "book.theurgy.the_hermetica.getting_started.needed_apparatus.name": "Required Apparatus", + "book.theurgy.the_hermetica.getting_started.needed_apparatus.next_steps.text": "Place all the apparatus, those that need heating on pyromantic braziers. Prepare some Coal to heat the braziers, then open the next entry.\n", + "book.theurgy.the_hermetica.getting_started.needed_apparatus.next_steps.title": "Next Steps", + "book.theurgy.the_hermetica.getting_started.needed_apparatus.pyromantic_brazier.text": "You will need 4 of these to power the other Apparatus.\n", + "book.theurgy.the_hermetica.getting_started.needed_apparatus.sal_ammoniac_accumulator.text": "The Sal Ammoniac Accumulator will fill the Sal Ammoniac Tank with solvent.\n", + "book.theurgy.the_hermetica.getting_started.needed_apparatus.sal_ammoniac_tank.text": "The Sal Ammoniac Tank stores the solvent - Sal Ammoniac - for use in the Liquefaction Cauldron.\n", + "book.theurgy.the_hermetica.getting_started.precious_sulfur_attuned_divination_rod.description": "An intricately crafted Sulfur-Attuned Divination rod, allowing to locate precious ores.", + "book.theurgy.the_hermetica.getting_started.precious_sulfur_attuned_divination_rod.intro.text": "This divination rod is the most powerful variant of pre-attuned rod, it is highly durable and allows to locate precious ores, such as [diamond](item://minecraft:diamond_ore).\n", + "book.theurgy.the_hermetica.getting_started.precious_sulfur_attuned_divination_rod.name": "Sulfur-Attuned Divination Rods for Precious Materials", + "book.theurgy.the_hermetica.getting_started.precious_sulfur_attuned_divination_rod.recipe.text": "A rod pre-attuned to precious ores, such as [diamond](item://minecraft:diamond_ore).\n", + "book.theurgy.the_hermetica.getting_started.rare_sulfur_attuned_divination_rod.description": "An improved design of Sulfur-Attuned Divination rods, allowing to locate rare ores.", + "book.theurgy.the_hermetica.getting_started.rare_sulfur_attuned_divination_rod.intro.text": "This divination rod is an improved variant of pre-attuned rod that is more durable allows to locate rare ores, such as [gold](item://minecraft:gold_ore).\n", + "book.theurgy.the_hermetica.getting_started.rare_sulfur_attuned_divination_rod.name": "Sulfur-Attuned Divination Rods for Rare Materials", + "book.theurgy.the_hermetica.getting_started.rare_sulfur_attuned_divination_rod.recipe.text": "A rod pre-attuned to rare ores, such as [gold](item://minecraft:gold_ore).\n", + "book.theurgy.the_hermetica.getting_started.spagyrics.description": "Mastery over Matter", + "book.theurgy.the_hermetica.getting_started.spagyrics.intro.text": "While divination rods are a useful tool to obtain *more* materials, they rely on the natural abundance of such materials.\n\\\n\\\nSpagyrics pursue the goal of *creating* materials out of other, possibly more abundant, materials.", + "book.theurgy.the_hermetica.getting_started.spagyrics.intro.title": "Spagyrics", + "book.theurgy.the_hermetica.getting_started.spagyrics.intro2.text": "Open the Spagyrics Category to learn more about the various required alchemical processes.\n", + "book.theurgy.the_hermetica.getting_started.spagyrics.intro2.title": "Learn More", + "book.theurgy.the_hermetica.getting_started.spagyrics.name": "Spagyrics", + "book.theurgy.the_hermetica.getting_started.spagyrics_link.description": "View the Spagyrics Category", + "book.theurgy.the_hermetica.getting_started.spagyrics_link.name": "Spagyrics", + "book.theurgy.the_hermetica.getting_started.t1_divination_rod.description": "A basic attunable rod for locating abundant and common ores.", + "book.theurgy.the_hermetica.getting_started.t1_divination_rod.intro.text": "This divination rod is the most basic variant of attunable rods. It does not require Alchemical Sulfur and can be attuned to a variety of blocks by using it on them, even after it has previously been attuned. However, it has a lower durability than pre-attuned rods.\n", + "book.theurgy.the_hermetica.getting_started.t1_divination_rod.name": "The Glass Divination Rod", + "book.theurgy.the_hermetica.getting_started.t1_divination_rod.recipe.text": "The most basic tier of divination rods, brittle and limited in it's application, but powerful nonetheless.\n", + "book.theurgy.the_hermetica.getting_started.t1_divination_rod.supported_blocks.text": "Rods can be attuned to a wide variety of useful blocks, including various types of ores and wood. Basic divination rods will be sufficient to locate common ores such as [iron](item://minecraft:iron_ore) or [coal](item://minecraft:coal_ore), but more rare and precious materials such as [gold](item://minecraft:gold_ore) and [diamonds](item://minecraft:diamond_ore) will require a higher tier rod to detect.\n", + "book.theurgy.the_hermetica.getting_started.t1_divination_rod.supported_blocks.title": "Attunable Materials", + "book.theurgy.the_hermetica.getting_started.t2_divination_rod.description": "An improved attunable rod for locating rare ores.", + "book.theurgy.the_hermetica.getting_started.t2_divination_rod.intro.text": "An improved attunable divination rod to locate higher tier ores, such as [gold](item://minecraft:gold_ore).\n", + "book.theurgy.the_hermetica.getting_started.t2_divination_rod.name": "The Iron Divination Rod", + "book.theurgy.the_hermetica.getting_started.t2_divination_rod.recipe.text": "An improved attunable divination rod, more durable and broader in it's application.\n", + "book.theurgy.the_hermetica.getting_started.t3_divination_rod.description": "A superior-grade attunable rod for locating precious ores.", + "book.theurgy.the_hermetica.getting_started.t3_divination_rod.intro.text": "A further improved attunable divination rod to locate high tier ores, such as [diamond](item://minecraft:diamond_ore).\n", + "book.theurgy.the_hermetica.getting_started.t3_divination_rod.name": "The Diamond Divination Rod", + "book.theurgy.the_hermetica.getting_started.t3_divination_rod.recipe.text": "A further improved attunable divination rod, much more durable and able to detect most ores.\n", + "book.theurgy.the_hermetica.getting_started.t4_divination_rod.description": "A very high durability attunable rod for locating precious ores.", + "book.theurgy.the_hermetica.getting_started.t4_divination_rod.intro.text": "The very high durability attunable divination rod to locate ores of any tier, such as [diamond](item://minecraft:diamond_ore).\n", + "book.theurgy.the_hermetica.getting_started.t4_divination_rod.name": "The Netherite Divination Rod", + "book.theurgy.the_hermetica.getting_started.t4_divination_rod.recipe.text": "The highest tier attunable divination rod, incredibly durable and able to detect all ores.\n", "book.theurgy.the_hermetica.name": "The Hermetica", + "book.theurgy.the_hermetica.spagyrics.about_ore_refining_link.description": "Return to the Getting Started Category to learn about Ore Refining", + "book.theurgy.the_hermetica.spagyrics.about_ore_refining_link.name": "Ore Refining", + "book.theurgy.the_hermetica.spagyrics.calcination_oven.description": "Making Salt", + "book.theurgy.the_hermetica.spagyrics.calcination_oven.intro.text": "Calcination is the process whereby [#](ad03fc)Alchemical Salt[#]() is extracted from matter. The [](item://theurgy:calcination_oven) is a simple device that can be used to perform this process by applying consistent high heat to the target object.\n", + "book.theurgy.the_hermetica.spagyrics.calcination_oven.intro.title": "Calcination Oven", + "book.theurgy.the_hermetica.spagyrics.calcination_oven.name": "Calcination Oven", + "book.theurgy.the_hermetica.spagyrics.calcination_oven.usage.text": "Place the [](item://theurgy:calcination_oven) on top of a [](item://theurgy:pyromantic_brazier), then insert the item to calcinate by right-clicking the oven with it.\n\\\n\\\nAlternatively a hopper can be used to insert items to process.\n\\\n\\\nSee also [Alchemical Apparatus](entry://getting_started/apparatus_how_to).\n", + "book.theurgy.the_hermetica.spagyrics.calcination_oven.usage.title": "Usage", + "book.theurgy.the_hermetica.spagyrics.calcination_oven.working.text": "If the [](item://theurgy:calcination_oven) is working properly, it will show the orange rings moving slightly.\n", + "book.theurgy.the_hermetica.spagyrics.calcination_oven.working.title": "Working Correctly", + "book.theurgy.the_hermetica.spagyrics.distiller.description": "Making Mercury", + "book.theurgy.the_hermetica.spagyrics.distiller.intro.text": "Distillation allows to obtain purified [#](ad03fc)Alchemical Mercury[#]() from matter. To this end the object is heated until it dissolves into a gaseous form and the resulting vapour is condensed into crystals. The Mercury obtained this way is stable and can be used in alchemical recipes.\n", + "book.theurgy.the_hermetica.spagyrics.distiller.intro.title": "Distiller", + "book.theurgy.the_hermetica.spagyrics.distiller.name": "Distiller", + "book.theurgy.the_hermetica.spagyrics.distiller.usage.text": "Place the [](item://theurgy:distiller) on top of a [](item://theurgy:pyromantic_brazier), then insert the item to distill by right-clicking the Distiller with it.\n\\\n\\\nAlternatively a hopper can be used to insert items to process.\n\\\n\\\nSee also [Alchemical Apparatus](entry://getting_started/apparatus_how_to).\n", + "book.theurgy.the_hermetica.spagyrics.distiller.usage.title": "Usage", + "book.theurgy.the_hermetica.spagyrics.distiller.working.text": "If the [](item://theurgy:distiller) is working properly, it will float with a bobbing motion.\n", + "book.theurgy.the_hermetica.spagyrics.distiller.working.title": "Working Correctly", + "book.theurgy.the_hermetica.spagyrics.incubator.description": "Making Matter", + "book.theurgy.the_hermetica.spagyrics.incubator.intro.text": "Incubation is the process of *recombination* of the Principles of Matter into actual objects.\\\nThe Incubator has one vessel for each of the Principles, and a central chamber where the recombination takes place.\n", + "book.theurgy.the_hermetica.spagyrics.incubator.intro.title": "Incubator", + "book.theurgy.the_hermetica.spagyrics.incubator.name": "Incubator", + "book.theurgy.the_hermetica.spagyrics.incubator.usage.text": "Place the [](item://theurgy:incubator) on top of a [](item://theurgy:pyromantic_brazier) and one of each of the three vessels next to it. Insert the items to process by right-clicking the vessels with them.\n\\\n\\\nAlternatively a hopper can be used to insert items to process.\\\nSee also [Alchemical Apparatus](entry://getting_started/apparatus_how_to).\n", + "book.theurgy.the_hermetica.spagyrics.incubator.usage.title": "Usage", + "book.theurgy.the_hermetica.spagyrics.incubator.working.text": "If the [](item://theurgy:incubator) is working properly, it will show smoke.\n", + "book.theurgy.the_hermetica.spagyrics.incubator.working.title": "Working Correctly", + "book.theurgy.the_hermetica.spagyrics.intro.description": "Power over the Three Principles", + "book.theurgy.the_hermetica.spagyrics.intro.intro.text": "Spagyrics is derived from Greek for \"to separate and reunite\". As such, it is the process of separating, purifying and recombining the *three principles*, or \"elements\", of matter: Alchemical **Salt**, **Sulfur** and **Mercury**.\n", + "book.theurgy.the_hermetica.spagyrics.intro.intro.title": "Spagyrics", + "book.theurgy.the_hermetica.spagyrics.intro.intro2.text": "The inquisitive mind may ask: \"Why would one want to do that?\". The answer lies in the promise of total control over all aspects of matter, including the ability to create any type of matter from any other type.\n", + "book.theurgy.the_hermetica.spagyrics.intro.intro2.title": "Benefits", + "book.theurgy.the_hermetica.spagyrics.intro.name": "Spagyrics", + "book.theurgy.the_hermetica.spagyrics.liquefaction_cauldron.description": "Making Sulfur", + "book.theurgy.the_hermetica.spagyrics.liquefaction_cauldron.intro.text": "Liquefaction allows the extraction of [#](ad03fc)Alchemical Sulfur[#]() from matter. In the [](item://theurgy:liquefaction_cauldron) a [#](ad03fc)Solvent[#](), usually a type of acid, is used to dissolve the target object, then the resulting solution is heated to evaporate the solvent and leave behind the Sulfur.\n", + "book.theurgy.the_hermetica.spagyrics.liquefaction_cauldron.intro.title": "Liquefaction Cauldron", + "book.theurgy.the_hermetica.spagyrics.liquefaction_cauldron.name": "Liquefaction Cauldron", + "book.theurgy.the_hermetica.spagyrics.liquefaction_cauldron.usage.text": "Place the [](item://theurgy:liquefaction_cauldron) on top of a [](item://theurgy:pyromantic_brazier), and fill it with a Solvent by right-clicking with a solvent-filled bucket.\n\\\n\\\nThen insert the item to liquefy by right-clicking the cauldron with it.\n\\\n\\\nSee also [Alchemical Apparatus](entry://getting_started/apparatus_how_to).\n", + "book.theurgy.the_hermetica.spagyrics.liquefaction_cauldron.usage.title": "Usage", + "book.theurgy.the_hermetica.spagyrics.liquefaction_cauldron.working.text": "If the [](item://theurgy:liquefaction_cauldron) is working properly, it will show bubbles.\n", + "book.theurgy.the_hermetica.spagyrics.liquefaction_cauldron.working.title": "Working Correctly", + "book.theurgy.the_hermetica.spagyrics.name": "Spagyrics", + "book.theurgy.the_hermetica.spagyrics.principles.description": "An Introduction to Alchemical Elements", + "book.theurgy.the_hermetica.spagyrics.principles.intro.text": "The [#](ad03fc)Principles[#](), or Essentials, are the three basic elements all things are made of.\n\\\n\\\nDespite the name, they are unrelated to the common materials often associated with these words, such as table salt, metallic mercury and the mineral sulfur.\n", + "book.theurgy.the_hermetica.spagyrics.principles.intro.title": "The Three Principles", + "book.theurgy.the_hermetica.spagyrics.principles.mercury.text": "[#](ad03fc)Alchemical Mercury[#]() is the **Energy** or Life Force of a thing. It is the most elusive of the three principles, and enables the other two principles to function.\n", + "book.theurgy.the_hermetica.spagyrics.principles.mercury.title": "Alchemical Mercury", + "book.theurgy.the_hermetica.spagyrics.principles.name": "The Three Principles", + "book.theurgy.the_hermetica.spagyrics.principles.salt.text": "[#](ad03fc)Alchemical Salt[#]() is the principle representing the **Body** of a thing. It provides the matrix wherein Sulfur and Mercury can act. As such it is associated with materiality, stability and manifestation in the physical world.\n", + "book.theurgy.the_hermetica.spagyrics.principles.salt.title": "Alchemical Salt", + "book.theurgy.the_hermetica.spagyrics.principles.sulfur.text": "[#](ad03fc)Alchemical Sulfur[#]() is the **Soul** of a thing. It represents the unique properties of a piece of matter, such as how it will look, feel, and how it interacts with other things.\n\\\n\\\nTransforming the Sulfur of one thing is the underlying idea of *transmutation*.\n", + "book.theurgy.the_hermetica.spagyrics.principles.sulfur.title": "Alchemical Sulfur", + "book.theurgy.the_hermetica.spagyrics.pyromantic_brazier.description": "Heating your Alchemical Devices", + "book.theurgy.the_hermetica.spagyrics.pyromantic_brazier.intro.text": "The [](item://theurgy:pyromantic_brazier) is a simple heating apparatus that can be used to power other Alchemical Devices. It is powered by burning furnace fuel, such as wood, coal, or charcoal.\n", + "book.theurgy.the_hermetica.spagyrics.pyromantic_brazier.intro.title": "Pyromantic Brazier", + "book.theurgy.the_hermetica.spagyrics.pyromantic_brazier.name": "Pyromantic Brazier", + "book.theurgy.the_hermetica.spagyrics.pyromantic_brazier.usage.text": "Place the [](item://theurgy:pyromantic_brazier) below the Alchemical Device you want to power, then insert a fuel item by right-clicking the brazier with it.\n\\\n\\\nAlternatively a hopper can be used to insert fuel items.\n\\\n\\\nSee also [Alchemical Apparatus](entry://getting_started/apparatus_how_to).\n", + "book.theurgy.the_hermetica.spagyrics.pyromantic_brazier.usage.title": "Usage", + "book.theurgy.the_hermetica.spagyrics.solvents.crafting.text": "Sal Ammoniac is crafted in a [](item://theurgy:sal_ammoniac_accumulator). It has two modes of operation: It can increase the concentration of naturally occuring Sal Ammoniac in water to a usable level via evaporation, which is a rather slow and inefficient process, or it can enrich water with [Sal Ammoniac Crystals](item://theurgy:sal_ammoniac_crystal) to produce a usable solvent much quicker.\n", + "book.theurgy.the_hermetica.spagyrics.solvents.crafting.title": "Crafting", + "book.theurgy.the_hermetica.spagyrics.solvents.description": "Solving all your problems?", + "book.theurgy.the_hermetica.spagyrics.solvents.intro.text": "Solvents are required for the process of Liquefaction, by which [#](ad03fc)Alchemical Sulfur[#]() is extracted from matter. Usually they are a type of acid. The following solvents are available:\n- Sal Ammoniac\n- Alkahest *(not yet implemented)*\n", + "book.theurgy.the_hermetica.spagyrics.solvents.intro.title": "Solvents", + "book.theurgy.the_hermetica.spagyrics.solvents.name": "Solvents", + "book.theurgy.the_hermetica.spagyrics.solvents.sal_ammoniac_crystal.text": "The crystals can be obtained by mining [](item://theurgy:sal_ammoniac_ore).\n", + "book.theurgy.the_hermetica.spagyrics.solvents.sal_ammoniac_fluid_recipe.title.2": "... using Crystal", + "book.theurgy.the_hermetica.spagyrics.solvents.usage.text": "Place the [](item://theurgy:sal_ammoniac_accumulator) on top of a [](item://theurgy:sal_ammoniac_tank), and fill it with a Water by right-clicking with a water bucket.\n\\\n\\\nOptionally insert a [](item://theurgy:sal_ammoniac_crystal) by right-clicking the cauldron with it to speed up the process.\n\\\n\\\nSee also [Alchemical Apparatus](entry://getting_started/apparatus_how_to).\n", + "book.theurgy.the_hermetica.spagyrics.solvents.usage.title": "Usage", + "book.theurgy.the_hermetica.spagyrics.solvents.working.text": "If the [](item://theurgy:sal_ammoniac_accumulator) is working properly, it will show bubbles.\n", + "book.theurgy.the_hermetica.spagyrics.solvents.working.title": "Working Correctly", "book.theurgy.the_hermetica.tooltip": "A treatise on the Ancient Art of Alchemy.\n§o(In-Game Guide for Theurgy)§r", - "item.theurgy.alchemical_sulfur": "Alchemical Sulfur %s", - "item.theurgy.alchemical_sulfur.tooltip": "Alchemical sulfur crafted from %s.", - "item.theurgy.alchemical_sulfur.tooltip.extended": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "fluid_type.theurgy.sal_ammoniac": "Sal Ammoniac", + "item.theurgy.alchemical_salt_crops": "Alchemical Salt %s", + "item.theurgy.alchemical_salt_crops.source": "Crops", + "item.theurgy.alchemical_salt_crops.tooltip": "Alchemical Salt calcinated from %s.", + "item.theurgy.alchemical_salt_crops.tooltip.usage": "Salt represents the \"body\" or \"physical matter\" of an object.", + "item.theurgy.alchemical_salt_mineral": "Alchemical Salt %s", + "item.theurgy.alchemical_salt_mineral.source": "Minerals", + "item.theurgy.alchemical_salt_mineral.tooltip": "Alchemical Salt calcinated from %s.", + "item.theurgy.alchemical_salt_mineral.tooltip.usage": "Salt represents the \"body\" or \"physical matter\" of an object.", + "item.theurgy.alchemical_salt_strata": "Alchemical Salt %s", + "item.theurgy.alchemical_salt_strata.source": "Strata", + "item.theurgy.alchemical_salt_strata.tooltip": "Alchemical Salt calcinated from %s.", + "item.theurgy.alchemical_salt_strata.tooltip.extended": "Salt extracted from the strata, that is, sedimentary rock, soil, clay and so on.", + "item.theurgy.alchemical_salt_strata.tooltip.usage": "Salt represents the \"body\" or \"physical matter\" of an object.", + "item.theurgy.alchemical_sulfur.unknown_source": "Unknown Source", + "item.theurgy.alchemical_sulfur_allthemodium": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_allthemodium.source": "Allthemodium", + "item.theurgy.alchemical_sulfur_allthemodium.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_allthemodium.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_amethyst": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_amethyst.source": "Amethyst", + "item.theurgy.alchemical_sulfur_amethyst.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_amethyst.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_apatite": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_apatite.source": "Apatite", + "item.theurgy.alchemical_sulfur_apatite.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_apatite.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_azure_silver": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_azure_silver.source": "Azure Silver", + "item.theurgy.alchemical_sulfur_azure_silver.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_azure_silver.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_cinnabar": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_cinnabar.source": "Cinnabar", + "item.theurgy.alchemical_sulfur_cinnabar.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_cinnabar.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_coal": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_coal.source": "Coal", + "item.theurgy.alchemical_sulfur_coal.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_coal.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_copper": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_copper.source": "Copper", + "item.theurgy.alchemical_sulfur_copper.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_copper.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_crimson_iron": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_crimson_iron.source": "Crimson Iron", + "item.theurgy.alchemical_sulfur_crimson_iron.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_crimson_iron.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_diamond": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_diamond.source": "Diamond", + "item.theurgy.alchemical_sulfur_diamond.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_diamond.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_emerald": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_emerald.source": "Emerald", + "item.theurgy.alchemical_sulfur_emerald.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_emerald.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_fluorite": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_fluorite.source": "Fluorite", + "item.theurgy.alchemical_sulfur_fluorite.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_fluorite.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_gold": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_gold.source": "Gold", + "item.theurgy.alchemical_sulfur_gold.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_gold.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_iridium": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_iridium.source": "Iridium", + "item.theurgy.alchemical_sulfur_iridium.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_iridium.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_iron": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_iron.source": "Iron", + "item.theurgy.alchemical_sulfur_iron.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_iron.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_lapis": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_lapis.source": "Lapis", + "item.theurgy.alchemical_sulfur_lapis.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_lapis.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_lead": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_lead.source": "Lead", + "item.theurgy.alchemical_sulfur_lead.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_lead.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_logs": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_logs.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_logs.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_netherite": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_netherite.source": "Netherite", + "item.theurgy.alchemical_sulfur_netherite.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_netherite.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_nickel": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_nickel.source": "Nickel", + "item.theurgy.alchemical_sulfur_nickel.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_nickel.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_osmium": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_osmium.source": "Osmium", + "item.theurgy.alchemical_sulfur_osmium.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_osmium.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_peridot": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_peridot.source": "Peridot", + "item.theurgy.alchemical_sulfur_peridot.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_peridot.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_platinum": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_platinum.source": "Platinum", + "item.theurgy.alchemical_sulfur_platinum.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_platinum.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_prismarine": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_prismarine.source": "Prismarine", + "item.theurgy.alchemical_sulfur_prismarine.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_prismarine.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_quartz": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_quartz.source": "Quartz", + "item.theurgy.alchemical_sulfur_quartz.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_quartz.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_redstone": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_redstone.source": "Redstone", + "item.theurgy.alchemical_sulfur_redstone.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_redstone.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_ruby": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_ruby.source": "Ruby", + "item.theurgy.alchemical_sulfur_ruby.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_ruby.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_sal_ammoniac": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_sal_ammoniac.source": "Sal Ammoniac", + "item.theurgy.alchemical_sulfur_sal_ammoniac.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_sal_ammoniac.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_sapphire": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_sapphire.source": "Sapphire", + "item.theurgy.alchemical_sulfur_sapphire.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_sapphire.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_silver": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_silver.source": "Silver", + "item.theurgy.alchemical_sulfur_silver.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_silver.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_sulfur": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_sulfur.source": "Sulfur", + "item.theurgy.alchemical_sulfur_sulfur.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_sulfur.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_tin": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_tin.source": "Tin", + "item.theurgy.alchemical_sulfur_tin.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_tin.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_unobtainium": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_unobtainium.source": "Unobtainium", + "item.theurgy.alchemical_sulfur_unobtainium.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_unobtainium.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_uranium": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_uranium.source": "Uranium", + "item.theurgy.alchemical_sulfur_uranium.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_uranium.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_vibranium": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_vibranium.source": "Vibranium", + "item.theurgy.alchemical_sulfur_vibranium.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_vibranium.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_wheat": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_wheat.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_wheat.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.alchemical_sulfur_zinc": "Alchemical Sulfur %s", + "item.theurgy.alchemical_sulfur_zinc.source": "Zinc", + "item.theurgy.alchemical_sulfur_zinc.tooltip": "Alchemical Sulfur crafted from %s.", + "item.theurgy.alchemical_sulfur_zinc.tooltip.usage": "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + "item.theurgy.amethyst_divination_rod": "Divination Rod: Amethyst", + "item.theurgy.amethyst_divination_rod.linked": "Divination Rod: %s", + "item.theurgy.amethyst_divination_rod.tooltip": "A divination rod attuned to find amethyst.", + "item.theurgy.amethyst_divination_rod.tooltip.extended": "This type of divination rod is crafted pre-attuned to find amethysts.", + "item.theurgy.amethyst_divination_rod.tooltip.usage": "§aCraft§r§7 the rod, it is automatically attuned to Amethyst.\n§aRight-Click and hold§r§7 to let the rod search for blocks.\n§aRight-Click without holding§r§7 after a successful search to let the rod show the last found block without consuming durability.\n", + "item.theurgy.divination_rod.unknown_linked_block": "Unknown Block (something went wrong)", "item.theurgy.divination_rod_t1": "Glass Divination Rod", "item.theurgy.divination_rod_t1.linked": "Glass Divination Rod %s", "item.theurgy.divination_rod_t1.tooltip.extended": "Divination rods can be attuned to a block and are then used to find other blocks of the same type.", - "item.theurgy.divination_rod_t1.tooltip.usage": "§aShift-Click§7 a block to attune the rod to it.\n§aRight-Click and hold§7to let the rod search for blocks.\n§aRight-Click without holding§7 after a successful search to let the rod show the last found block without consuming durability.", + "item.theurgy.divination_rod_t1.tooltip.usage": "§aCrouch-Click§r§7 a block to attune the rod to it.\n§aRight-Click and hold§r§7 to let the rod search for blocks.\n§aRight-Click without holding§r§7 after a successful search to let the rod show the last found block without consuming durability.\n", "item.theurgy.divination_rod_t2": "Iron Divination Rod", "item.theurgy.divination_rod_t2.linked": "Iron Divination Rod %s", "item.theurgy.divination_rod_t2.tooltip.extended": "Divination rods can be attuned to a block and are then used to find other blocks of the same type.", - "item.theurgy.divination_rod_t2.tooltip.usage": "§aShift-Click§7 a block to attune the rod to it.\n§aRight-Click and hold§7to let the rod search for blocks.\n§aRight-Click without holding§7 after a successful search to let the rod show the last found block without consuming durability.", + "item.theurgy.divination_rod_t2.tooltip.usage": "§aCrouch-Click§r§7 a block to attune the rod to it.\n§aRight-Click and hold§r§7 to let the rod search for blocks.\n§aRight-Click without holding§r§7 after a successful search to let the rod show the last found block without consuming durability.\n", "item.theurgy.divination_rod_t3": "Diamond Divination Rod", "item.theurgy.divination_rod_t3.linked": "Diamond Divination Rod %s", "item.theurgy.divination_rod_t3.tooltip.extended": "Divination rods can be attuned to a block and are then used to find other blocks of the same type.", - "item.theurgy.divination_rod_t3.tooltip.usage": "§aShift-Click§7 a block to attune the rod to it.\n§aRight-Click and hold§7to let the rod search for blocks.\n§aRight-Click without holding§7 after a successful search to let the rod show the last found block without consuming durability.", + "item.theurgy.divination_rod_t3.tooltip.usage": "§aCrouch-Click§r§7 a block to attune the rod to it.\n§aRight-Click and hold§r§7 to let the rod search for blocks.\n§aRight-Click without holding§r§7 after a successful search to let the rod show the last found block without consuming durability.\n", "item.theurgy.divination_rod_t4": "Netherite Divination Rod", "item.theurgy.divination_rod_t4.linked": "Netherite Divination Rod %s", "item.theurgy.divination_rod_t4.tooltip.extended": "Divination rods can be attuned to a block and are then used to find other blocks of the same type.", - "item.theurgy.divination_rod_t4.tooltip.usage": "§aShift-Click§7 a block to attune the rod to it.\n§aRight-Click and hold§7to let the rod search for blocks.\n§aRight-Click without holding§7 after a successful search to let the rod show the last found block without consuming durability.", + "item.theurgy.divination_rod_t4.tooltip.usage": "§aCrouch-Click§r§7 a block to attune the rod to it.\n§aRight-Click and hold§r§7 to let the rod search for blocks.\n§aRight-Click without holding§r§7 after a successful search to let the rod show the last found block without consuming durability.\n", "item.theurgy.empty_jar": "Empty Jar", "item.theurgy.empty_jar_labeled": "Labeled Empty Jar", "item.theurgy.empty_jar_labeled.tooltip": "Dummy item for rendering Alchemical Sulfur if source items are not shown.", "item.theurgy.jar_label": "Jar Label", "item.theurgy.jar_label.tooltip": "Dummy item for rendering Alchemical Sulfur if source items are shown.", + "item.theurgy.mercury_crystal": "Mercury Crystal", + "item.theurgy.mercury_crystal.tooltip.extended": "Mercury crystals are large pieces of Mercury in crystalline form. Their main uses are as ingredient in Digestion processes and as an energy source.", + "item.theurgy.mercury_shard": "Mercury Shard", + "item.theurgy.mercury_shard.tooltip.extended": "Mercury shards are small pieces of Mercury in crystalline form. Their main uses are as ingredient in Digestion processes and as an energy source.", + "item.theurgy.sal_ammoniac_bucket": "Sal Ammoniac Bucket", + "item.theurgy.sal_ammoniac_crystal": "Sal Ammoniac Crystal", + "item.theurgy.sal_ammoniac_crystal.tooltip.extended": "Obtained by mining Sal Ammoniac Ore.\nCan be used in a Sal Ammoniac Accumulator to rapidly create Sal Ammoniac to be used as a solvent.\n", + "item.theurgy.sulfur_attuned_divination_rod_abundant": "Divination Rod: Abundant Materials", + "item.theurgy.sulfur_attuned_divination_rod_abundant.linked": "Divination Rod: Abundant Materials %s", + "item.theurgy.sulfur_attuned_divination_rod_abundant.tooltip": "A divination rod attuned to find abundant materials by crafting it with an abundant alchemical sulfur.", + "item.theurgy.sulfur_attuned_divination_rod_abundant.tooltip.extended": "This type of divination rod is crafted pre-attuned to find blocks of the a specific type.", + "item.theurgy.sulfur_attuned_divination_rod_abundant.tooltip.usage": "§aCraft§r§7 the rod with a type of Alchemical Sulfur to attune the rod to it.\n§aRight-Click and hold§r§7 to let the rod search for blocks.\n§aRight-Click without holding§r§7 after a successful search to let the rod show the last found block without consuming durability.\n", + "item.theurgy.sulfur_attuned_divination_rod_common": "Divination Rod: Common Materials", + "item.theurgy.sulfur_attuned_divination_rod_common.linked": "Divination Rod: Common Materials %s", + "item.theurgy.sulfur_attuned_divination_rod_common.tooltip": "A divination rod attuned to find common materials by crafting it with a common alchemical sulfur.", + "item.theurgy.sulfur_attuned_divination_rod_common.tooltip.extended": "This type of divination rod is crafted pre-attuned to find blocks of the a specific type.", + "item.theurgy.sulfur_attuned_divination_rod_common.tooltip.usage": "§aCraft§r§7 the rod with a type of Alchemical Sulfur to attune the rod to it.\n§aRight-Click and hold§r§7 to let the rod search for blocks.\n§aRight-Click without holding§r§7 after a successful search to let the rod show the last found block without consuming durability.\n", + "item.theurgy.sulfur_attuned_divination_rod_precious": "Divination Rod: Precious Materials", + "item.theurgy.sulfur_attuned_divination_rod_precious.linked": "Divination Rod: Precious Materials %s", + "item.theurgy.sulfur_attuned_divination_rod_precious.tooltip": "A divination rod attuned to find precious materials by crafting it with a precious alchemical sulfur.", + "item.theurgy.sulfur_attuned_divination_rod_precious.tooltip.extended": "This type of divination rod is crafted pre-attuned to find blocks of the a specific type.", + "item.theurgy.sulfur_attuned_divination_rod_precious.tooltip.usage": "§aCraft§r§7 the rod with a type of Alchemical Sulfur to attune the rod to it.\n§aRight-Click and hold§r§7 to let the rod search for blocks.\n§aRight-Click without holding§r§7 after a successful search to let the rod show the last found block without consuming durability.\n", + "item.theurgy.sulfur_attuned_divination_rod_rare": "Divination Rod: Rare Materials", + "item.theurgy.sulfur_attuned_divination_rod_rare.linked": "Divination Rod: Rare Materials %s", + "item.theurgy.sulfur_attuned_divination_rod_rare.tooltip": "A divination rod attuned to find rare materials by crafting it with a rare alchemical sulfur.", + "item.theurgy.sulfur_attuned_divination_rod_rare.tooltip.extended": "This type of divination rod is crafted pre-attuned to find blocks of the a specific type.", + "item.theurgy.sulfur_attuned_divination_rod_rare.tooltip.usage": "§aCraft§r§7 the rod with a type of Alchemical Sulfur to attune the rod to it.\n§aRight-Click and hold§r§7 to let the rod search for blocks.\n§aRight-Click without holding§r§7 after a successful search to let the rod show the last found block without consuming durability.\n", "itemGroup.theurgy": "Theurgy", - "message.theurgy.divination_rod.attuning_not_allowed": "§4Warning§r: This type of divination rod cannot be manually attuned.", - "message.theurgy.divination_rod.block_disallowed": "§4Warning§r: The divination rod cannot be attuned to this type of block: %s.", - "message.theurgy.divination_rod.block_not_allowed": "§4Warning§r: The divination rod cannot be attuned to this type of block: %s.", - "message.theurgy.divination_rod.linked": "§aSuccess§r: The divination rod is now attuned to %s.", + "jei.theurgy.ingredient.sal_ammoniac_crystal.description": "Obtained by mining Sal Ammoniac Ore.", + "message.theurgy.divination_rod.attuning_not_allowed": "§4Warning§r§7: This type of divination rod cannot be manually attuned.", + "message.theurgy.divination_rod.block_disallowed": "§4Warning§r§7: The divination rod cannot be attuned to this type of block: %s.", + "message.theurgy.divination_rod.block_not_allowed": "§4Warning§r§7: The divination rod cannot be attuned to this type of block: %s.", + "message.theurgy.divination_rod.linked": "§aSuccess§r§7: The divination rod is now attuned to %s.", "message.theurgy.divination_rod.no_link": "The divination rod is not attuned to any material.", - "message.theurgy.divination_rod.tier_too_low": "§4Warning§r: You need a higher tier divination rod to attune to %s.", + "message.theurgy.divination_rod.tier_too_low": "§4Warning§r§7: You need a higher tier divination rod to attune to %s.", + "tag.minecraft.logs": "Logs", + "theurgy.jei.category.accumulation": "Accumulation", + "theurgy.jei.category.calcination": "Calcination", + "theurgy.jei.category.distillation": "Distillation", + "theurgy.jei.category.incubation": "Incubation", + "theurgy.jei.category.liquefaction": "Liquefaction", + "theurgy.misc.unit.millibuckets": "%smB", "theurgy.subtitle.tuning_fork": "Using Divination Rod", "tooltip.theurgy..divination_rod.last_result": "Found %s at %s.", "tooltip.theurgy..divination_rod.linked_to": "The divination rod is attuned to %s", "tooltip.theurgy..divination_rod.no_link": "The divination rod is §cnot attuned§r to any material.", - "tooltip.theurgy.show_extended": "§6[§dshift §7read more§6]", - "tooltip.theurgy.show_usage": "§6[§dctrl §7show usage§6]" + "tooltip.theurgy.extended_heading": "§6[§7more§6]", + "tooltip.theurgy.show_extended": "§6[§dshift §7show more§6]", + "tooltip.theurgy.show_usage": "§6[§dctrl §7show usage§6]", + "tooltip.theurgy.usage_heading": "§6[§7usage§6]" } \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/block/calcination_oven.json b/src/generated/resources/assets/theurgy/models/block/calcination_oven.json new file mode 100644 index 000000000..8fa0027ab --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/block/calcination_oven.json @@ -0,0 +1,5 @@ +{ + "textures": { + "particle": "minecraft:block/copper_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/block/deepslate_sal_ammoniac_ore.json b/src/generated/resources/assets/theurgy/models/block/deepslate_sal_ammoniac_ore.json new file mode 100644 index 000000000..3368ff708 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/block/deepslate_sal_ammoniac_ore.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "theurgy:block/deepslate_sal_ammoniac_ore" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/block/distiller.json b/src/generated/resources/assets/theurgy/models/block/distiller.json new file mode 100644 index 000000000..8fa0027ab --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/block/distiller.json @@ -0,0 +1,5 @@ +{ + "textures": { + "particle": "minecraft:block/copper_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/block/incubator_lower.json b/src/generated/resources/assets/theurgy/models/block/incubator_lower.json new file mode 100644 index 000000000..5027b2fce --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/block/incubator_lower.json @@ -0,0 +1,8 @@ +{ + "parent": "theurgy:block/incubator_template", + "ambientocclusion": false, + "textures": { + "particle": "minecraft:block/copper_block", + "texture": "theurgy:block/incubator_gold" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/block/incubator_pipe.json b/src/generated/resources/assets/theurgy/models/block/incubator_pipe.json new file mode 100644 index 000000000..52ff1dea1 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/block/incubator_pipe.json @@ -0,0 +1,8 @@ +{ + "parent": "theurgy:block/incubator_pipe_template", + "ambientocclusion": false, + "textures": { + "particle": "minecraft:block/copper_block", + "texture": "theurgy:block/incubator_pipe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/block/incubator_upper.json b/src/generated/resources/assets/theurgy/models/block/incubator_upper.json new file mode 100644 index 000000000..548ec5871 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/block/incubator_upper.json @@ -0,0 +1,6 @@ +{ + "ambientocclusion": false, + "textures": { + "particle": "minecraft:block/copper_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/block/incubator_vessel.json b/src/generated/resources/assets/theurgy/models/block/incubator_vessel.json new file mode 100644 index 000000000..8fa0027ab --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/block/incubator_vessel.json @@ -0,0 +1,5 @@ +{ + "textures": { + "particle": "minecraft:block/copper_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/block/liquefaction_cauldron_lower.json b/src/generated/resources/assets/theurgy/models/block/liquefaction_cauldron_lower.json new file mode 100644 index 000000000..daba0e264 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/block/liquefaction_cauldron_lower.json @@ -0,0 +1,8 @@ +{ + "parent": "theurgy:block/liquefaction_cauldron_template", + "ambientocclusion": false, + "textures": { + "particle": "minecraft:block/copper_block", + "texture": "theurgy:block/liquefaction_cauldron" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/block/liquefaction_cauldron_upper.json b/src/generated/resources/assets/theurgy/models/block/liquefaction_cauldron_upper.json new file mode 100644 index 000000000..8fa0027ab --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/block/liquefaction_cauldron_upper.json @@ -0,0 +1,5 @@ +{ + "textures": { + "particle": "minecraft:block/copper_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/block/pyromantic_brazier.json b/src/generated/resources/assets/theurgy/models/block/pyromantic_brazier.json new file mode 100644 index 000000000..8456e31e8 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/block/pyromantic_brazier.json @@ -0,0 +1,8 @@ +{ + "parent": "theurgy:block/pyromantic_brazier_template", + "ambientocclusion": false, + "textures": { + "particle": "minecraft:block/copper_block", + "texture": "theurgy:block/pyromantic_brazier" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/block/pyromantic_brazier_lit.json b/src/generated/resources/assets/theurgy/models/block/pyromantic_brazier_lit.json new file mode 100644 index 000000000..a82901ff3 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/block/pyromantic_brazier_lit.json @@ -0,0 +1,9 @@ +{ + "parent": "theurgy:block/pyromantic_brazier_lit_template", + "render_type": "minecraft:cutout_mipped", + "textures": { + "fire": "minecraft:block/campfire_fire", + "particle": "minecraft:block/copper_block", + "texture": "theurgy:block/pyromantic_brazier_lit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/block/sal_ammoniac_accumulator.json b/src/generated/resources/assets/theurgy/models/block/sal_ammoniac_accumulator.json new file mode 100644 index 000000000..3884aa374 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/block/sal_ammoniac_accumulator.json @@ -0,0 +1,8 @@ +{ + "parent": "theurgy:block/sal_ammoniac_accumulator_template", + "ambientocclusion": false, + "textures": { + "particle": "minecraft:block/copper_block", + "texture": "theurgy:block/sal_ammoniac_accumulator" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/block/sal_ammoniac_ore.json b/src/generated/resources/assets/theurgy/models/block/sal_ammoniac_ore.json new file mode 100644 index 000000000..b524d2a97 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/block/sal_ammoniac_ore.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "theurgy:block/sal_ammoniac_ore" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/block/sal_ammoniac_tank.json b/src/generated/resources/assets/theurgy/models/block/sal_ammoniac_tank.json new file mode 100644 index 000000000..8fa0027ab --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/block/sal_ammoniac_tank.json @@ -0,0 +1,5 @@ +{ + "textures": { + "particle": "minecraft:block/copper_block" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_salt.json b/src/generated/resources/assets/theurgy/models/item/alchemical_salt.json new file mode 100644 index 000000000..e55bf0e94 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_salt.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/alchemical_salt" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_salt_crops.json b/src/generated/resources/assets/theurgy/models/item/alchemical_salt_crops.json new file mode 100644 index 000000000..86e2b1ace --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_salt_crops.json @@ -0,0 +1,3 @@ +{ + "parent": "theurgy:item/alchemical_salt" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_salt_mineral.json b/src/generated/resources/assets/theurgy/models/item/alchemical_salt_mineral.json new file mode 100644 index 000000000..86e2b1ace --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_salt_mineral.json @@ -0,0 +1,3 @@ +{ + "parent": "theurgy:item/alchemical_salt" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_salt_strata.json b/src/generated/resources/assets/theurgy/models/item/alchemical_salt_strata.json new file mode 100644 index 000000000..86e2b1ace --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_salt_strata.json @@ -0,0 +1,3 @@ +{ + "parent": "theurgy:item/alchemical_salt" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_allthemodium.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/alchemical_sulfur.json rename to src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_allthemodium.json diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_amethyst.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_amethyst.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_amethyst.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_apatite.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_apatite.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_apatite.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_azure_silver.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_azure_silver.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_azure_silver.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_cinnabar.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_cinnabar.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_cinnabar.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_coal.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_coal.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_coal.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_copper.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_copper.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_crimson_iron.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_crimson_iron.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_crimson_iron.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_diamond.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_diamond.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_diamond.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_emerald.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_emerald.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_emerald.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_fluorite.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_fluorite.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_fluorite.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_gold.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_gold.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_gold.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_iridium.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_iridium.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_iridium.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_iron.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_iron.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_iron.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_lapis.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_lapis.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_lapis.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_lead.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_lead.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_lead.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_logs.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_logs.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_logs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_netherite.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_netherite.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_netherite.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_nickel.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_nickel.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_nickel.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_osmium.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_osmium.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_osmium.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_peridot.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_peridot.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_peridot.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_platinum.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_platinum.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_platinum.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_prismarine.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_prismarine.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_prismarine.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_quartz.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_quartz.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_quartz.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_redstone.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_redstone.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_redstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_ruby.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_ruby.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_ruby.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_sal_ammoniac.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_sal_ammoniac.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_sal_ammoniac.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_sapphire.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_sapphire.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_sapphire.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_silver.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_silver.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_silver.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_sulfur.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_sulfur.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_sulfur.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_tin.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_tin.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_tin.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_unobtainium.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_unobtainium.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_unobtainium.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_uranium.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_uranium.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_uranium.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_vibranium.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_vibranium.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_vibranium.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_wheat.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_wheat.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_wheat.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_zinc.json b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_zinc.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/alchemical_sulfur_zinc.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod.json b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod.json new file mode 100644 index 000000000..0dbf1dba6 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod.json @@ -0,0 +1,59 @@ +{ + "parent": "theurgy:item/amethyst_divination_rod/0", + "overrides": [ + { + "model": "theurgy:item/amethyst_divination_rod/7", + "predicate": { + "theurgy:divination_distance": 0.0 + } + }, + { + "model": "theurgy:item/amethyst_divination_rod/6", + "predicate": { + "theurgy:divination_distance": 1.0 + } + }, + { + "model": "theurgy:item/amethyst_divination_rod/5", + "predicate": { + "theurgy:divination_distance": 2.0 + } + }, + { + "model": "theurgy:item/amethyst_divination_rod/4", + "predicate": { + "theurgy:divination_distance": 3.0 + } + }, + { + "model": "theurgy:item/amethyst_divination_rod/3", + "predicate": { + "theurgy:divination_distance": 4.0 + } + }, + { + "model": "theurgy:item/amethyst_divination_rod/2", + "predicate": { + "theurgy:divination_distance": 5.0 + } + }, + { + "model": "theurgy:item/amethyst_divination_rod/1", + "predicate": { + "theurgy:divination_distance": 6.0 + } + }, + { + "model": "theurgy:item/amethyst_divination_rod/0", + "predicate": { + "theurgy:divination_distance": 7.0 + } + }, + { + "model": "theurgy:item/amethyst_divination_rod/searching", + "predicate": { + "theurgy:divination_distance": 8.0 + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/0.json b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/0.json new file mode 100644 index 000000000..9eee1497e --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/0.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/amethyst_divination_rod/divination_rod_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/1.json b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/1.json new file mode 100644 index 000000000..3be130a6a --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/amethyst_divination_rod/divination_rod_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/2.json b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/2.json new file mode 100644 index 000000000..147b185a3 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/amethyst_divination_rod/divination_rod_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/3.json b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/3.json new file mode 100644 index 000000000..bfa5064d2 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/amethyst_divination_rod/divination_rod_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/4.json b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/4.json new file mode 100644 index 000000000..c7fb8f83f --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/4.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/amethyst_divination_rod/divination_rod_4" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/5.json b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/5.json new file mode 100644 index 000000000..87ad66ee2 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/5.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/amethyst_divination_rod/divination_rod_5" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/6.json b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/6.json new file mode 100644 index 000000000..25c9ec098 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/6.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/amethyst_divination_rod/divination_rod_6" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/7.json b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/7.json new file mode 100644 index 000000000..cd0384556 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/7.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/amethyst_divination_rod/divination_rod_7" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/searching.json b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/searching.json new file mode 100644 index 000000000..eb1cb1716 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/amethyst_divination_rod/searching.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/amethyst_divination_rod/divination_rod_searching" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/calcination_oven.json b/src/generated/resources/assets/theurgy/models/item/calcination_oven.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/calcination_oven.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/deepslate_sal_ammoniac_ore.json b/src/generated/resources/assets/theurgy/models/item/deepslate_sal_ammoniac_ore.json new file mode 100644 index 000000000..785be5cdb --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/deepslate_sal_ammoniac_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "theurgy:block/deepslate_sal_ammoniac_ore" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/distiller.json b/src/generated/resources/assets/theurgy/models/item/distiller.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/distiller.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1.json index 501f9c9d6..8e00d2c4f 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1.json @@ -1,56 +1,56 @@ { - "parent": "theurgy:item/divination_rod_t1_0", + "parent": "theurgy:item/divination_rod_t1/0", "overrides": [ { - "model": "theurgy:item/divination_rod_t1_7", + "model": "theurgy:item/divination_rod_t1/7", "predicate": { "theurgy:divination_distance": 0.0 } }, { - "model": "theurgy:item/divination_rod_t1_6", + "model": "theurgy:item/divination_rod_t1/6", "predicate": { "theurgy:divination_distance": 1.0 } }, { - "model": "theurgy:item/divination_rod_t1_5", + "model": "theurgy:item/divination_rod_t1/5", "predicate": { "theurgy:divination_distance": 2.0 } }, { - "model": "theurgy:item/divination_rod_t1_4", + "model": "theurgy:item/divination_rod_t1/4", "predicate": { "theurgy:divination_distance": 3.0 } }, { - "model": "theurgy:item/divination_rod_t1_3", + "model": "theurgy:item/divination_rod_t1/3", "predicate": { "theurgy:divination_distance": 4.0 } }, { - "model": "theurgy:item/divination_rod_t1_2", + "model": "theurgy:item/divination_rod_t1/2", "predicate": { "theurgy:divination_distance": 5.0 } }, { - "model": "theurgy:item/divination_rod_t1_1", + "model": "theurgy:item/divination_rod_t1/1", "predicate": { "theurgy:divination_distance": 6.0 } }, { - "model": "theurgy:item/divination_rod_t1_0", + "model": "theurgy:item/divination_rod_t1/0", "predicate": { "theurgy:divination_distance": 7.0 } }, { - "model": "theurgy:item/divination_rod_t1_searching", + "model": "theurgy:item/divination_rod_t1/searching", "predicate": { "theurgy:divination_distance": 8.0 } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1_0.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/0.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t1_0.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t1/0.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1_1.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/1.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t1_1.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t1/1.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1_2.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/2.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t1_2.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t1/2.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1_3.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/3.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t1_3.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t1/3.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1_4.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/4.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t1_4.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t1/4.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1_5.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/5.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t1_5.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t1/5.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1_6.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/6.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t1_6.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t1/6.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1_7.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/7.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t1_7.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t1/7.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t1_searching.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t1/searching.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t1_searching.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t1/searching.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2.json index a66063b26..272c1ffe2 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2.json @@ -1,56 +1,56 @@ { - "parent": "theurgy:item/divination_rod_t2_0", + "parent": "theurgy:item/divination_rod_t2/0", "overrides": [ { - "model": "theurgy:item/divination_rod_t2_7", + "model": "theurgy:item/divination_rod_t2/7", "predicate": { "theurgy:divination_distance": 0.0 } }, { - "model": "theurgy:item/divination_rod_t2_6", + "model": "theurgy:item/divination_rod_t2/6", "predicate": { "theurgy:divination_distance": 1.0 } }, { - "model": "theurgy:item/divination_rod_t2_5", + "model": "theurgy:item/divination_rod_t2/5", "predicate": { "theurgy:divination_distance": 2.0 } }, { - "model": "theurgy:item/divination_rod_t2_4", + "model": "theurgy:item/divination_rod_t2/4", "predicate": { "theurgy:divination_distance": 3.0 } }, { - "model": "theurgy:item/divination_rod_t2_3", + "model": "theurgy:item/divination_rod_t2/3", "predicate": { "theurgy:divination_distance": 4.0 } }, { - "model": "theurgy:item/divination_rod_t2_2", + "model": "theurgy:item/divination_rod_t2/2", "predicate": { "theurgy:divination_distance": 5.0 } }, { - "model": "theurgy:item/divination_rod_t2_1", + "model": "theurgy:item/divination_rod_t2/1", "predicate": { "theurgy:divination_distance": 6.0 } }, { - "model": "theurgy:item/divination_rod_t2_0", + "model": "theurgy:item/divination_rod_t2/0", "predicate": { "theurgy:divination_distance": 7.0 } }, { - "model": "theurgy:item/divination_rod_t2_searching", + "model": "theurgy:item/divination_rod_t2/searching", "predicate": { "theurgy:divination_distance": 8.0 } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2_0.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/0.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t2_0.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t2/0.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2_1.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/1.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t2_1.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t2/1.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2_2.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/2.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t2_2.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t2/2.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2_3.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/3.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t2_3.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t2/3.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2_4.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/4.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t2_4.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t2/4.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2_5.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/5.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t2_5.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t2/5.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2_6.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/6.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t2_6.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t2/6.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2_7.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/7.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t2_7.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t2/7.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t2_searching.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t2/searching.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t2_searching.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t2/searching.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3.json index 1723f6ca9..e9c7cc549 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3.json @@ -1,56 +1,56 @@ { - "parent": "theurgy:item/divination_rod_t3_0", + "parent": "theurgy:item/divination_rod_t3/0", "overrides": [ { - "model": "theurgy:item/divination_rod_t3_7", + "model": "theurgy:item/divination_rod_t3/7", "predicate": { "theurgy:divination_distance": 0.0 } }, { - "model": "theurgy:item/divination_rod_t3_6", + "model": "theurgy:item/divination_rod_t3/6", "predicate": { "theurgy:divination_distance": 1.0 } }, { - "model": "theurgy:item/divination_rod_t3_5", + "model": "theurgy:item/divination_rod_t3/5", "predicate": { "theurgy:divination_distance": 2.0 } }, { - "model": "theurgy:item/divination_rod_t3_4", + "model": "theurgy:item/divination_rod_t3/4", "predicate": { "theurgy:divination_distance": 3.0 } }, { - "model": "theurgy:item/divination_rod_t3_3", + "model": "theurgy:item/divination_rod_t3/3", "predicate": { "theurgy:divination_distance": 4.0 } }, { - "model": "theurgy:item/divination_rod_t3_2", + "model": "theurgy:item/divination_rod_t3/2", "predicate": { "theurgy:divination_distance": 5.0 } }, { - "model": "theurgy:item/divination_rod_t3_1", + "model": "theurgy:item/divination_rod_t3/1", "predicate": { "theurgy:divination_distance": 6.0 } }, { - "model": "theurgy:item/divination_rod_t3_0", + "model": "theurgy:item/divination_rod_t3/0", "predicate": { "theurgy:divination_distance": 7.0 } }, { - "model": "theurgy:item/divination_rod_t3_searching", + "model": "theurgy:item/divination_rod_t3/searching", "predicate": { "theurgy:divination_distance": 8.0 } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3_0.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/0.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t3_0.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t3/0.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3_1.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/1.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t3_1.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t3/1.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3_2.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/2.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t3_2.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t3/2.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3_3.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/3.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t3_3.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t3/3.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3_4.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/4.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t3_4.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t3/4.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3_5.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/5.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t3_5.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t3/5.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3_6.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/6.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t3_6.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t3/6.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3_7.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/7.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t3_7.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t3/7.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t3_searching.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t3/searching.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t3_searching.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t3/searching.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4.json index 593c1d70f..1f53a424c 100644 --- a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4.json +++ b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4.json @@ -1,56 +1,56 @@ { - "parent": "theurgy:item/divination_rod_t4_0", + "parent": "theurgy:item/divination_rod_t4/0", "overrides": [ { - "model": "theurgy:item/divination_rod_t4_7", + "model": "theurgy:item/divination_rod_t4/7", "predicate": { "theurgy:divination_distance": 0.0 } }, { - "model": "theurgy:item/divination_rod_t4_6", + "model": "theurgy:item/divination_rod_t4/6", "predicate": { "theurgy:divination_distance": 1.0 } }, { - "model": "theurgy:item/divination_rod_t4_5", + "model": "theurgy:item/divination_rod_t4/5", "predicate": { "theurgy:divination_distance": 2.0 } }, { - "model": "theurgy:item/divination_rod_t4_4", + "model": "theurgy:item/divination_rod_t4/4", "predicate": { "theurgy:divination_distance": 3.0 } }, { - "model": "theurgy:item/divination_rod_t4_3", + "model": "theurgy:item/divination_rod_t4/3", "predicate": { "theurgy:divination_distance": 4.0 } }, { - "model": "theurgy:item/divination_rod_t4_2", + "model": "theurgy:item/divination_rod_t4/2", "predicate": { "theurgy:divination_distance": 5.0 } }, { - "model": "theurgy:item/divination_rod_t4_1", + "model": "theurgy:item/divination_rod_t4/1", "predicate": { "theurgy:divination_distance": 6.0 } }, { - "model": "theurgy:item/divination_rod_t4_0", + "model": "theurgy:item/divination_rod_t4/0", "predicate": { "theurgy:divination_distance": 7.0 } }, { - "model": "theurgy:item/divination_rod_t4_searching", + "model": "theurgy:item/divination_rod_t4/searching", "predicate": { "theurgy:divination_distance": 8.0 } diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4_0.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/0.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t4_0.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t4/0.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4_1.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/1.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t4_1.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t4/1.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4_2.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/2.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t4_2.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t4/2.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4_3.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/3.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t4_3.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t4/3.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4_4.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/4.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t4_4.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t4/4.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4_5.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/5.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t4_5.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t4/5.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4_6.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/6.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t4_6.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t4/6.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4_7.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/7.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t4_7.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t4/7.json diff --git a/src/generated/resources/assets/theurgy/models/item/divination_rod_t4_searching.json b/src/generated/resources/assets/theurgy/models/item/divination_rod_t4/searching.json similarity index 100% rename from src/generated/resources/assets/theurgy/models/item/divination_rod_t4_searching.json rename to src/generated/resources/assets/theurgy/models/item/divination_rod_t4/searching.json diff --git a/src/generated/resources/assets/theurgy/models/item/incubator.json b/src/generated/resources/assets/theurgy/models/item/incubator.json new file mode 100644 index 000000000..e49c611d2 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/incubator.json @@ -0,0 +1,22 @@ +{ + "parent": "theurgy:block/incubator_lower", + "display": { + "gui": { + "rotation": [ + 30, + 225, + 0 + ], + "scale": [ + 0.35, + 0.35, + 0.35 + ], + "translation": [ + 0, + -2, + 0 + ] + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/incubator_mercury_vessel.json b/src/generated/resources/assets/theurgy/models/item/incubator_mercury_vessel.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/incubator_mercury_vessel.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/incubator_salt_vessel.json b/src/generated/resources/assets/theurgy/models/item/incubator_salt_vessel.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/incubator_salt_vessel.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/incubator_sulfur_vessel.json b/src/generated/resources/assets/theurgy/models/item/incubator_sulfur_vessel.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/incubator_sulfur_vessel.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/liquefaction_cauldron.json b/src/generated/resources/assets/theurgy/models/item/liquefaction_cauldron.json new file mode 100644 index 000000000..f19830c65 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/liquefaction_cauldron.json @@ -0,0 +1,22 @@ +{ + "parent": "theurgy:block/liquefaction_cauldron_lower", + "display": { + "gui": { + "rotation": [ + 30, + 225, + 0 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ], + "translation": [ + 0, + -2, + 0 + ] + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/mercury_crystal.json b/src/generated/resources/assets/theurgy/models/item/mercury_crystal.json new file mode 100644 index 000000000..44e0a1791 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/mercury_crystal.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/mercury_crystal" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/mercury_shard.json b/src/generated/resources/assets/theurgy/models/item/mercury_shard.json new file mode 100644 index 000000000..d42ddc33d --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/mercury_shard.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/pyromantic_brazier.json b/src/generated/resources/assets/theurgy/models/item/pyromantic_brazier.json new file mode 100644 index 000000000..998232671 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/pyromantic_brazier.json @@ -0,0 +1,17 @@ +{ + "parent": "theurgy:block/pyromantic_brazier", + "display": { + "gui": { + "rotation": [ + 30, + 225, + 0 + ], + "scale": [ + 0.5, + 0.5, + 0.5 + ] + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sal_ammoniac_accumulator.json b/src/generated/resources/assets/theurgy/models/item/sal_ammoniac_accumulator.json new file mode 100644 index 000000000..20b3d0bc0 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sal_ammoniac_accumulator.json @@ -0,0 +1,3 @@ +{ + "parent": "theurgy:block/sal_ammoniac_accumulator" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sal_ammoniac_crystal.json b/src/generated/resources/assets/theurgy/models/item/sal_ammoniac_crystal.json new file mode 100644 index 000000000..ad5f82488 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sal_ammoniac_crystal.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sal_ammoniac_crystal" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sal_ammoniac_ore.json b/src/generated/resources/assets/theurgy/models/item/sal_ammoniac_ore.json new file mode 100644 index 000000000..d13b3294f --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sal_ammoniac_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "theurgy:block/sal_ammoniac_ore" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sal_ammoniac_tank.json b/src/generated/resources/assets/theurgy/models/item/sal_ammoniac_tank.json new file mode 100644 index 000000000..ad08d9786 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sal_ammoniac_tank.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:builtin/entity" +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant.json new file mode 100644 index 000000000..ba8b2eadd --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant.json @@ -0,0 +1,59 @@ +{ + "parent": "theurgy:item/sulfur_attuned_divination_rod_abundant/0", + "overrides": [ + { + "model": "theurgy:item/sulfur_attuned_divination_rod_abundant/7", + "predicate": { + "theurgy:divination_distance": 0.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_abundant/6", + "predicate": { + "theurgy:divination_distance": 1.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_abundant/5", + "predicate": { + "theurgy:divination_distance": 2.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_abundant/4", + "predicate": { + "theurgy:divination_distance": 3.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_abundant/3", + "predicate": { + "theurgy:divination_distance": 4.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_abundant/2", + "predicate": { + "theurgy:divination_distance": 5.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_abundant/1", + "predicate": { + "theurgy:divination_distance": 6.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_abundant/0", + "predicate": { + "theurgy:divination_distance": 7.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_abundant/searching", + "predicate": { + "theurgy:divination_distance": 8.0 + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/0.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/0.json new file mode 100644 index 000000000..75984f906 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/0.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_abundant/divination_rod_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/1.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/1.json new file mode 100644 index 000000000..390bb33f4 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_abundant/divination_rod_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/2.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/2.json new file mode 100644 index 000000000..2ff512202 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_abundant/divination_rod_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/3.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/3.json new file mode 100644 index 000000000..4b02bf32e --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_abundant/divination_rod_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/4.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/4.json new file mode 100644 index 000000000..439d69597 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/4.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_abundant/divination_rod_4" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/5.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/5.json new file mode 100644 index 000000000..565df0499 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/5.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_abundant/divination_rod_5" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/6.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/6.json new file mode 100644 index 000000000..ca346b3a8 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/6.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_abundant/divination_rod_6" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/7.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/7.json new file mode 100644 index 000000000..06d6d987a --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/7.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_abundant/divination_rod_7" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/searching.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/searching.json new file mode 100644 index 000000000..b2f354fff --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_abundant/searching.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_abundant/divination_rod_searching" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common.json new file mode 100644 index 000000000..ef17599b7 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common.json @@ -0,0 +1,59 @@ +{ + "parent": "theurgy:item/sulfur_attuned_divination_rod_common/0", + "overrides": [ + { + "model": "theurgy:item/sulfur_attuned_divination_rod_common/7", + "predicate": { + "theurgy:divination_distance": 0.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_common/6", + "predicate": { + "theurgy:divination_distance": 1.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_common/5", + "predicate": { + "theurgy:divination_distance": 2.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_common/4", + "predicate": { + "theurgy:divination_distance": 3.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_common/3", + "predicate": { + "theurgy:divination_distance": 4.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_common/2", + "predicate": { + "theurgy:divination_distance": 5.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_common/1", + "predicate": { + "theurgy:divination_distance": 6.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_common/0", + "predicate": { + "theurgy:divination_distance": 7.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_common/searching", + "predicate": { + "theurgy:divination_distance": 8.0 + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/0.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/0.json new file mode 100644 index 000000000..d2b08297f --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/0.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_common/divination_rod_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/1.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/1.json new file mode 100644 index 000000000..f9c151c09 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_common/divination_rod_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/2.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/2.json new file mode 100644 index 000000000..1a627f498 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_common/divination_rod_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/3.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/3.json new file mode 100644 index 000000000..feaa491e6 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_common/divination_rod_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/4.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/4.json new file mode 100644 index 000000000..2b723c8ac --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/4.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_common/divination_rod_4" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/5.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/5.json new file mode 100644 index 000000000..1f2e08123 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/5.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_common/divination_rod_5" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/6.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/6.json new file mode 100644 index 000000000..3fb425909 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/6.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_common/divination_rod_6" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/7.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/7.json new file mode 100644 index 000000000..4a2bd5d0c --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/7.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_common/divination_rod_7" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/searching.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/searching.json new file mode 100644 index 000000000..ab3e23094 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_common/searching.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_common/divination_rod_searching" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious.json new file mode 100644 index 000000000..55b603b14 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious.json @@ -0,0 +1,59 @@ +{ + "parent": "theurgy:item/sulfur_attuned_divination_rod_precious/0", + "overrides": [ + { + "model": "theurgy:item/sulfur_attuned_divination_rod_precious/7", + "predicate": { + "theurgy:divination_distance": 0.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_precious/6", + "predicate": { + "theurgy:divination_distance": 1.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_precious/5", + "predicate": { + "theurgy:divination_distance": 2.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_precious/4", + "predicate": { + "theurgy:divination_distance": 3.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_precious/3", + "predicate": { + "theurgy:divination_distance": 4.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_precious/2", + "predicate": { + "theurgy:divination_distance": 5.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_precious/1", + "predicate": { + "theurgy:divination_distance": 6.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_precious/0", + "predicate": { + "theurgy:divination_distance": 7.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_precious/searching", + "predicate": { + "theurgy:divination_distance": 8.0 + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/0.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/0.json new file mode 100644 index 000000000..1cc2c9380 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/0.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_precious/divination_rod_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/1.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/1.json new file mode 100644 index 000000000..f8a0d1d9e --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_precious/divination_rod_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/2.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/2.json new file mode 100644 index 000000000..fd308e6da --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_precious/divination_rod_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/3.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/3.json new file mode 100644 index 000000000..314afc418 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_precious/divination_rod_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/4.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/4.json new file mode 100644 index 000000000..36b59dbb0 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/4.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_precious/divination_rod_4" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/5.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/5.json new file mode 100644 index 000000000..bb33905fb --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/5.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_precious/divination_rod_5" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/6.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/6.json new file mode 100644 index 000000000..3202ff597 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/6.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_precious/divination_rod_6" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/7.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/7.json new file mode 100644 index 000000000..7d2d87b3e --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/7.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_precious/divination_rod_7" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/searching.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/searching.json new file mode 100644 index 000000000..3c4128884 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_precious/searching.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_precious/divination_rod_searching" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare.json new file mode 100644 index 000000000..4b07e3a53 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare.json @@ -0,0 +1,59 @@ +{ + "parent": "theurgy:item/sulfur_attuned_divination_rod_rare/0", + "overrides": [ + { + "model": "theurgy:item/sulfur_attuned_divination_rod_rare/7", + "predicate": { + "theurgy:divination_distance": 0.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_rare/6", + "predicate": { + "theurgy:divination_distance": 1.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_rare/5", + "predicate": { + "theurgy:divination_distance": 2.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_rare/4", + "predicate": { + "theurgy:divination_distance": 3.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_rare/3", + "predicate": { + "theurgy:divination_distance": 4.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_rare/2", + "predicate": { + "theurgy:divination_distance": 5.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_rare/1", + "predicate": { + "theurgy:divination_distance": 6.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_rare/0", + "predicate": { + "theurgy:divination_distance": 7.0 + } + }, + { + "model": "theurgy:item/sulfur_attuned_divination_rod_rare/searching", + "predicate": { + "theurgy:divination_distance": 8.0 + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/0.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/0.json new file mode 100644 index 000000000..58f7ab774 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/0.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_rare/divination_rod_0" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/1.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/1.json new file mode 100644 index 000000000..90083c58a --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_rare/divination_rod_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/2.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/2.json new file mode 100644 index 000000000..00ff95e19 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_rare/divination_rod_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/3.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/3.json new file mode 100644 index 000000000..ae53f1e7e --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_rare/divination_rod_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/4.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/4.json new file mode 100644 index 000000000..1112c8a49 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/4.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_rare/divination_rod_4" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/5.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/5.json new file mode 100644 index 000000000..54917049f --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/5.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_rare/divination_rod_5" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/6.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/6.json new file mode 100644 index 000000000..d7d74e229 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/6.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_rare/divination_rod_6" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/7.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/7.json new file mode 100644 index 000000000..374432450 --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/7.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_rare/divination_rod_7" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/searching.json b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/searching.json new file mode 100644 index 000000000..551012c9a --- /dev/null +++ b/src/generated/resources/assets/theurgy/models/item/sulfur_attuned_divination_rod_rare/searching.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "theurgy:item/sulfur_attuned_divination_rod_rare/divination_rod_searching" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/ores.json b/src/generated/resources/data/forge/tags/blocks/ores.json new file mode 100644 index 000000000..6a99ed0a2 --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/ores.json @@ -0,0 +1,5 @@ +{ + "values": [ + "#forge:ores/sal_ammoniac" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/ores/sal_ammoniac.json b/src/generated/resources/data/forge/tags/blocks/ores/sal_ammoniac.json new file mode 100644 index 000000000..bea127a92 --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/ores/sal_ammoniac.json @@ -0,0 +1,6 @@ +{ + "values": [ + "theurgy:sal_ammoniac_ore", + "theurgy:deepslate_sal_ammoniac_ore" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/ores_in_ground/deepslate.json b/src/generated/resources/data/forge/tags/blocks/ores_in_ground/deepslate.json new file mode 100644 index 000000000..6bb0fe213 --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/ores_in_ground/deepslate.json @@ -0,0 +1,5 @@ +{ + "values": [ + "theurgy:deepslate_sal_ammoniac_ore" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/ores_in_ground/stone.json b/src/generated/resources/data/forge/tags/blocks/ores_in_ground/stone.json new file mode 100644 index 000000000..b051aa023 --- /dev/null +++ b/src/generated/resources/data/forge/tags/blocks/ores_in_ground/stone.json @@ -0,0 +1,5 @@ +{ + "values": [ + "theurgy:sal_ammoniac_ore" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/gems.json b/src/generated/resources/data/forge/tags/items/gems.json new file mode 100644 index 000000000..85c474a74 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/gems.json @@ -0,0 +1,5 @@ +{ + "values": [ + "#forge:gems/sal_ammoniac" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/gems/sal_ammoniac.json b/src/generated/resources/data/forge/tags/items/gems/sal_ammoniac.json new file mode 100644 index 000000000..6b0019617 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/gems/sal_ammoniac.json @@ -0,0 +1,5 @@ +{ + "values": [ + "theurgy:sal_ammoniac_crystal" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/ores/sal_ammoniac.json b/src/generated/resources/data/forge/tags/items/ores/sal_ammoniac.json new file mode 100644 index 000000000..bea127a92 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/ores/sal_ammoniac.json @@ -0,0 +1,6 @@ +{ + "values": [ + "theurgy:sal_ammoniac_ore", + "theurgy:deepslate_sal_ammoniac_ore" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/ores_in_ground/deepslate.json b/src/generated/resources/data/forge/tags/items/ores_in_ground/deepslate.json new file mode 100644 index 000000000..6bb0fe213 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/ores_in_ground/deepslate.json @@ -0,0 +1,5 @@ +{ + "values": [ + "theurgy:deepslate_sal_ammoniac_ore" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/items/ores_in_ground/stone.json b/src/generated/resources/data/forge/tags/items/ores_in_ground/stone.json new file mode 100644 index 000000000..b051aa023 --- /dev/null +++ b/src/generated/resources/data/forge/tags/items/ores_in_ground/stone.json @@ -0,0 +1,5 @@ +{ + "values": [ + "theurgy:sal_ammoniac_ore" + ] +} \ 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 new file mode 100644 index 000000000..6a99ed0a2 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -0,0 +1,5 @@ +{ + "values": [ + "#forge:ores/sal_ammoniac" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/needs_stone_tool.json b/src/generated/resources/data/minecraft/tags/blocks/needs_stone_tool.json new file mode 100644 index 000000000..6a99ed0a2 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/needs_stone_tool.json @@ -0,0 +1,5 @@ +{ + "values": [ + "#forge:ores/sal_ammoniac" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/advancements/book_root.json b/src/generated/resources/data/theurgy/advancements/book_root.json new file mode 100644 index 000000000..5705d8247 --- /dev/null +++ b/src/generated/resources/data/theurgy/advancements/book_root.json @@ -0,0 +1,14 @@ +{ + "criteria": { + "theurgy_present": { + "conditions": {}, + "trigger": "minecraft:tick" + } + }, + "requirements": [ + [ + "theurgy_present" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/advancements/has_amethyst_rod.json b/src/generated/resources/data/theurgy/advancements/has_amethyst_rod.json new file mode 100644 index 000000000..5989098df --- /dev/null +++ b/src/generated/resources/data/theurgy/advancements/has_amethyst_rod.json @@ -0,0 +1,23 @@ +{ + "parent": "theurgy:book_root", + "criteria": { + "has_amethyst_rod": { + "conditions": { + "items": [ + { + "items": [ + "theurgy:amethyst_divination_rod" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_amethyst_rod" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/advancements/has_basic_rod.json b/src/generated/resources/data/theurgy/advancements/has_basic_rod.json new file mode 100644 index 000000000..e6502ce0f --- /dev/null +++ b/src/generated/resources/data/theurgy/advancements/has_basic_rod.json @@ -0,0 +1,49 @@ +{ + "parent": "theurgy:book_root", + "criteria": { + "has_abundant_rod": { + "conditions": { + "items": [ + { + "items": [ + "theurgy:sulfur_attuned_divination_rod_abundant" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_common_rod": { + "conditions": { + "items": [ + { + "items": [ + "theurgy:sulfur_attuned_divination_rod_common" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_t1_rod": { + "conditions": { + "items": [ + { + "items": [ + "theurgy:divination_rod_t1" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_t1_rod", + "has_abundant_rod", + "has_common_rod" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/advancements/has_liquefaction_cauldron.json b/src/generated/resources/data/theurgy/advancements/has_liquefaction_cauldron.json new file mode 100644 index 000000000..dfc41a1a9 --- /dev/null +++ b/src/generated/resources/data/theurgy/advancements/has_liquefaction_cauldron.json @@ -0,0 +1,23 @@ +{ + "parent": "theurgy:book_root", + "criteria": { + "has_liquefaction_cauldron": { + "conditions": { + "items": [ + { + "items": [ + "theurgy:liquefaction_cauldron" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_liquefaction_cauldron" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/advancements/has_precious_rod.json b/src/generated/resources/data/theurgy/advancements/has_precious_rod.json new file mode 100644 index 000000000..fc9a7fac8 --- /dev/null +++ b/src/generated/resources/data/theurgy/advancements/has_precious_rod.json @@ -0,0 +1,23 @@ +{ + "parent": "theurgy:book_root", + "criteria": { + "has_precious_rod": { + "conditions": { + "items": [ + { + "items": [ + "theurgy:sulfur_attuned_divination_rod_precious" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_precious_rod" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/advancements/has_rare_rod.json b/src/generated/resources/data/theurgy/advancements/has_rare_rod.json new file mode 100644 index 000000000..61a603801 --- /dev/null +++ b/src/generated/resources/data/theurgy/advancements/has_rare_rod.json @@ -0,0 +1,23 @@ +{ + "parent": "theurgy:book_root", + "criteria": { + "has_rare_rod": { + "conditions": { + "items": [ + { + "items": [ + "theurgy:sulfur_attuned_divination_rod_rare" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_rare_rod" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/advancements/has_t2_rod.json b/src/generated/resources/data/theurgy/advancements/has_t2_rod.json new file mode 100644 index 000000000..5aaa33a42 --- /dev/null +++ b/src/generated/resources/data/theurgy/advancements/has_t2_rod.json @@ -0,0 +1,23 @@ +{ + "parent": "theurgy:book_root", + "criteria": { + "has_t2_rod": { + "conditions": { + "items": [ + { + "items": [ + "theurgy:divination_rod_t2" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_t2_rod" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/advancements/has_t3_rod.json b/src/generated/resources/data/theurgy/advancements/has_t3_rod.json new file mode 100644 index 000000000..633475ee5 --- /dev/null +++ b/src/generated/resources/data/theurgy/advancements/has_t3_rod.json @@ -0,0 +1,23 @@ +{ + "parent": "theurgy:book_root", + "criteria": { + "has_t3_rod": { + "conditions": { + "items": [ + { + "items": [ + "theurgy:divination_rod_t3" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_t3_rod" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/advancements/has_t4_rod.json b/src/generated/resources/data/theurgy/advancements/has_t4_rod.json new file mode 100644 index 000000000..5b6fd6b4b --- /dev/null +++ b/src/generated/resources/data/theurgy/advancements/has_t4_rod.json @@ -0,0 +1,23 @@ +{ + "parent": "theurgy:book_root", + "criteria": { + "has_t4_rod": { + "conditions": { + "items": [ + { + "items": [ + "theurgy:divination_rod_t4" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + } + }, + "requirements": [ + [ + "has_t4_rod" + ] + ], + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/forge/biome_modifier/add_sal_ammoniac_ore.json b/src/generated/resources/data/theurgy/forge/biome_modifier/add_sal_ammoniac_ore.json new file mode 100644 index 000000000..be525f685 --- /dev/null +++ b/src/generated/resources/data/theurgy/forge/biome_modifier/add_sal_ammoniac_ore.json @@ -0,0 +1,6 @@ +{ + "type": "forge:add_features", + "biomes": "#minecraft:is_overworld", + "features": "theurgy:sal_ammoniac_ore", + "step": "underground_ores" +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/loot_tables/blocks/calcination_oven.json b/src/generated/resources/data/theurgy/loot_tables/blocks/calcination_oven.json new file mode 100644 index 000000000..45f3679c8 --- /dev/null +++ b/src/generated/resources/data/theurgy/loot_tables/blocks/calcination_oven.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "theurgy:calcination_oven", + "condition": "minecraft:block_state_property", + "properties": { + "half": "lower" + } + } + ], + "name": "theurgy:calcination_oven" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "theurgy:blocks/calcination_oven" +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/loot_tables/blocks/deepslate_sal_ammoniac_ore.json b/src/generated/resources/data/theurgy/loot_tables/blocks/deepslate_sal_ammoniac_ore.json new file mode 100644 index 000000000..23086153d --- /dev/null +++ b/src/generated/resources/data/theurgy/loot_tables/blocks/deepslate_sal_ammoniac_ore.json @@ -0,0 +1,50 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "theurgy:deepslate_sal_ammoniac_ore" + }, + { + "type": "minecraft:item", + "functions": [ + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:ore_drops", + "function": "minecraft:apply_bonus" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "theurgy:sal_ammoniac_crystal" + } + ] + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "theurgy:blocks/deepslate_sal_ammoniac_ore" +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/loot_tables/blocks/distiller.json b/src/generated/resources/data/theurgy/loot_tables/blocks/distiller.json new file mode 100644 index 000000000..a3524e602 --- /dev/null +++ b/src/generated/resources/data/theurgy/loot_tables/blocks/distiller.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "theurgy:distiller", + "condition": "minecraft:block_state_property", + "properties": { + "half": "lower" + } + } + ], + "name": "theurgy:distiller" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "theurgy:blocks/distiller" +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/loot_tables/blocks/incubator.json b/src/generated/resources/data/theurgy/loot_tables/blocks/incubator.json new file mode 100644 index 000000000..989cf654a --- /dev/null +++ b/src/generated/resources/data/theurgy/loot_tables/blocks/incubator.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "theurgy:incubator", + "condition": "minecraft:block_state_property", + "properties": { + "half": "lower" + } + } + ], + "name": "theurgy:incubator" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "theurgy:blocks/incubator" +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/loot_tables/blocks/incubator_mercury_vessel.json b/src/generated/resources/data/theurgy/loot_tables/blocks/incubator_mercury_vessel.json new file mode 100644 index 000000000..b38d25718 --- /dev/null +++ b/src/generated/resources/data/theurgy/loot_tables/blocks/incubator_mercury_vessel.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "theurgy:incubator_mercury_vessel" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "theurgy:blocks/incubator_mercury_vessel" +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/loot_tables/blocks/incubator_salt_vessel.json b/src/generated/resources/data/theurgy/loot_tables/blocks/incubator_salt_vessel.json new file mode 100644 index 000000000..3b3414c1f --- /dev/null +++ b/src/generated/resources/data/theurgy/loot_tables/blocks/incubator_salt_vessel.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "theurgy:incubator_salt_vessel" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "theurgy:blocks/incubator_salt_vessel" +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/loot_tables/blocks/incubator_sulfur_vessel.json b/src/generated/resources/data/theurgy/loot_tables/blocks/incubator_sulfur_vessel.json new file mode 100644 index 000000000..df19110f5 --- /dev/null +++ b/src/generated/resources/data/theurgy/loot_tables/blocks/incubator_sulfur_vessel.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "theurgy:incubator_sulfur_vessel" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "theurgy:blocks/incubator_sulfur_vessel" +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/loot_tables/blocks/liquefaction_cauldron.json b/src/generated/resources/data/theurgy/loot_tables/blocks/liquefaction_cauldron.json new file mode 100644 index 000000000..76c25361d --- /dev/null +++ b/src/generated/resources/data/theurgy/loot_tables/blocks/liquefaction_cauldron.json @@ -0,0 +1,30 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "conditions": [ + { + "block": "theurgy:liquefaction_cauldron", + "condition": "minecraft:block_state_property", + "properties": { + "half": "lower" + } + } + ], + "name": "theurgy:liquefaction_cauldron" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "theurgy:blocks/liquefaction_cauldron" +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/loot_tables/blocks/pyromantic_brazier.json b/src/generated/resources/data/theurgy/loot_tables/blocks/pyromantic_brazier.json new file mode 100644 index 000000000..f0f6b33f6 --- /dev/null +++ b/src/generated/resources/data/theurgy/loot_tables/blocks/pyromantic_brazier.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "theurgy:pyromantic_brazier" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "theurgy:blocks/pyromantic_brazier" +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/loot_tables/blocks/sal_ammoniac_accumulator.json b/src/generated/resources/data/theurgy/loot_tables/blocks/sal_ammoniac_accumulator.json new file mode 100644 index 000000000..baa1ec844 --- /dev/null +++ b/src/generated/resources/data/theurgy/loot_tables/blocks/sal_ammoniac_accumulator.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "theurgy:sal_ammoniac_accumulator" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "theurgy:blocks/sal_ammoniac_accumulator" +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/loot_tables/blocks/sal_ammoniac_ore.json b/src/generated/resources/data/theurgy/loot_tables/blocks/sal_ammoniac_ore.json new file mode 100644 index 000000000..85e055642 --- /dev/null +++ b/src/generated/resources/data/theurgy/loot_tables/blocks/sal_ammoniac_ore.json @@ -0,0 +1,50 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:alternatives", + "children": [ + { + "type": "minecraft:item", + "conditions": [ + { + "condition": "minecraft:match_tool", + "predicate": { + "enchantments": [ + { + "enchantment": "minecraft:silk_touch", + "levels": { + "min": 1 + } + } + ] + } + } + ], + "name": "theurgy:sal_ammoniac_ore" + }, + { + "type": "minecraft:item", + "functions": [ + { + "enchantment": "minecraft:fortune", + "formula": "minecraft:ore_drops", + "function": "minecraft:apply_bonus" + }, + { + "function": "minecraft:explosion_decay" + } + ], + "name": "theurgy:sal_ammoniac_crystal" + } + ] + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "theurgy:blocks/sal_ammoniac_ore" +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/loot_tables/blocks/sal_ammoniac_tank.json b/src/generated/resources/data/theurgy/loot_tables/blocks/sal_ammoniac_tank.json new file mode 100644 index 000000000..a4bf5c11a --- /dev/null +++ b/src/generated/resources/data/theurgy/loot_tables/blocks/sal_ammoniac_tank.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "theurgy:sal_ammoniac_tank" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "theurgy:blocks/sal_ammoniac_tank" +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/categories/getting_started.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/categories/getting_started.json index 184218aaf..a98b0a0c9 100644 --- a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/categories/getting_started.json +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/categories/getting_started.json @@ -1,5 +1,5 @@ { - "background": "modonomicon:textures/gui/dark_slate_seamless.png", + "background": "theurgy:textures/gui/book/bg_nightsky.png", "background_height": 512, "background_parallax_layers": [], "background_width": 512, diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/categories/spagyrics.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/categories/spagyrics.json new file mode 100644 index 000000000..ac9ef5463 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/categories/spagyrics.json @@ -0,0 +1,15 @@ +{ + "background": "theurgy:textures/gui/book/bg_nightsky2.png", + "background_height": 512, + "background_parallax_layers": [], + "background_width": 512, + "condition": { + "type": "modonomicon:entry_read", + "entry_id": "theurgy:getting_started/spagyrics" + }, + "entry_textures": "modonomicon:textures/gui/entry_textures.png", + "icon": "theurgy:calcination_oven", + "name": "book.theurgy.the_hermetica.spagyrics.name", + "show_category_button": true, + "sort_number": 2 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/about_divination_rods.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/about_divination_rods.json new file mode 100644 index 000000000..dac37de6e --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/about_divination_rods.json @@ -0,0 +1,62 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:getting_started", + "description": "book.theurgy.the_hermetica.getting_started.about_divination_rods.description", + "hide_while_locked": false, + "icon": "theurgy:divination_rod_t1", + "name": "book.theurgy.the_hermetica.getting_started.about_divination_rods.name", + "pages": [ + { + "type": "modonomicon:spotlight", + "anchor": "", + "item": { + "item": "theurgy:divination_rod_t1" + }, + "text": "book.theurgy.the_hermetica.getting_started.about_divination_rods.intro.text", + "title": "book.theurgy.the_hermetica.getting_started.about_divination_rods.intro.title" + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.about_divination_rods.intro2.text", + "title": "book.theurgy.the_hermetica.getting_started.about_divination_rods.intro2.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.about_divination_rods.sulfur_attuned_rods.text", + "title": "book.theurgy.the_hermetica.getting_started.about_divination_rods.sulfur_attuned_rods.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.about_divination_rods.usage.text", + "title": "book.theurgy.the_hermetica.getting_started.about_divination_rods.usage.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.about_divination_rods.usage2.text", + "title": "book.theurgy.the_hermetica.getting_started.about_divination_rods.usage2.title", + "use_markdown_in_title": false + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:getting_started/about_mod", + "line_enabled": true, + "line_reversed": false + } + ], + "x": -1, + "y": -3 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/about_mod.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/about_mod.json index 46ae8963a..0702ef580 100644 --- a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/about_mod.json +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/about_mod.json @@ -23,6 +23,14 @@ "title": "", "use_markdown_in_title": false }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.about_mod.about3.text", + "title": "", + "use_markdown_in_title": false + }, { "type": "modonomicon:text", "anchor": "", @@ -48,6 +56,6 @@ "line_reversed": false } ], - "x": -7, - "y": 2 + "x": -5, + "y": 1 } \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/about_ore_refining.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/about_ore_refining.json new file mode 100644 index 000000000..1b8d66703 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/about_ore_refining.json @@ -0,0 +1,86 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:getting_started", + "description": "book.theurgy.the_hermetica.getting_started.about_ore_refining.description", + "hide_while_locked": false, + "icon": "minecraft:raw_iron", + "name": "book.theurgy.the_hermetica.getting_started.about_ore_refining.name", + "pages": [ + { + "type": "modonomicon:spotlight", + "anchor": "", + "item": { + "item": "minecraft:raw_iron" + }, + "text": "book.theurgy.the_hermetica.getting_started.about_ore_refining.intro.text", + "title": "book.theurgy.the_hermetica.getting_started.about_ore_refining.intro.title" + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.about_ore_refining.intro2.text", + "title": "book.theurgy.the_hermetica.getting_started.about_ore_refining.intro2.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.about_ore_refining.overview.text", + "title": "book.theurgy.the_hermetica.getting_started.about_ore_refining.overview.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.about_ore_refining.cost.text", + "title": "book.theurgy.the_hermetica.getting_started.about_ore_refining.cost.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.about_ore_refining.cost2.text", + "title": "book.theurgy.the_hermetica.getting_started.about_ore_refining.cost2.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.about_ore_refining.silver_lining.text", + "title": "book.theurgy.the_hermetica.getting_started.about_ore_refining.silver_lining.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.about_ore_refining.soul.text", + "title": "book.theurgy.the_hermetica.getting_started.about_ore_refining.soul.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.about_ore_refining.next.text", + "title": "book.theurgy.the_hermetica.getting_started.about_ore_refining.next.title", + "use_markdown_in_title": false + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:getting_started/spagyrics_link", + "line_enabled": true, + "line_reversed": false + } + ], + "x": 3, + "y": 3 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/abundant_and_common_sulfur_attuned_divination_rod.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/abundant_and_common_sulfur_attuned_divination_rod.json new file mode 100644 index 000000000..e9f2a9d68 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/abundant_and_common_sulfur_attuned_divination_rod.json @@ -0,0 +1,65 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:getting_started", + "description": "book.theurgy.the_hermetica.getting_started.abundant_and_common_sulfur_attuned_divination_rod.description", + "hide_while_locked": false, + "icon": "theurgy:sulfur_attuned_divination_rod_abundant", + "name": "book.theurgy.the_hermetica.getting_started.abundant_and_common_sulfur_attuned_divination_rod.name", + "pages": [ + { + "type": "modonomicon:spotlight", + "anchor": "", + "item": [ + { + "item": "theurgy:sulfur_attuned_divination_rod_abundant" + }, + { + "item": "theurgy:sulfur_attuned_divination_rod_common" + } + ], + "text": "book.theurgy.the_hermetica.getting_started.abundant_and_common_sulfur_attuned_divination_rod.intro.text", + "title": "" + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.abundant_and_common_sulfur_attuned_divination_rod.sulfur.text", + "title": "book.theurgy.the_hermetica.getting_started.abundant_and_common_sulfur_attuned_divination_rod.sulfur.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:crafting_recipe", + "anchor": "", + "recipe_id_1": "theurgy:crafting/shaped/sulfur_attuned_divination_rod_abundant", + "text": "book.theurgy.the_hermetica.getting_started.abundant_and_common_sulfur_attuned_divination_rod.recipe_abundant.text", + "title1": "", + "title2": "" + }, + { + "type": "modonomicon:crafting_recipe", + "anchor": "", + "recipe_id_1": "theurgy:crafting/shaped/sulfur_attuned_divination_rod_common", + "text": "book.theurgy.the_hermetica.getting_started.abundant_and_common_sulfur_attuned_divination_rod.recipe_common.text", + "title1": "", + "title2": "" + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:getting_started/about_divination_rods", + "line_enabled": true, + "line_reversed": false + }, + { + "draw_arrow": true, + "entry": "theurgy:getting_started/spagyrics_link", + "line_enabled": true, + "line_reversed": false + } + ], + "x": 1, + "y": -1 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/amethyst_divination_rod.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/amethyst_divination_rod.json new file mode 100644 index 000000000..4f5e07777 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/amethyst_divination_rod.json @@ -0,0 +1,44 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:getting_started", + "description": "book.theurgy.the_hermetica.getting_started.amethyst_divination_rod.description", + "hide_while_locked": false, + "icon": "theurgy:amethyst_divination_rod", + "name": "book.theurgy.the_hermetica.getting_started.amethyst_divination_rod.name", + "pages": [ + { + "type": "modonomicon:spotlight", + "anchor": "", + "item": { + "item": "theurgy:amethyst_divination_rod" + }, + "text": "book.theurgy.the_hermetica.getting_started.amethyst_divination_rod.intro.text", + "title": "" + }, + { + "type": "modonomicon:crafting_recipe", + "anchor": "", + "recipe_id_1": "theurgy:crafting/shaped/amethyst_divination_rod", + "text": "book.theurgy.the_hermetica.getting_started.amethyst_divination_rod.recipe.text", + "title1": "", + "title2": "" + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:getting_started/t1_divination_rod", + "line_enabled": true, + "line_reversed": false + }, + { + "draw_arrow": true, + "entry": "theurgy:getting_started/abundant_and_common_sulfur_attuned_divination_rod", + "line_enabled": true, + "line_reversed": false + } + ], + "x": 3, + "y": -3 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/apparatus_how_to.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/apparatus_how_to.json new file mode 100644 index 000000000..0d2db29c7 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/apparatus_how_to.json @@ -0,0 +1,69 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:getting_started", + "description": "book.theurgy.the_hermetica.getting_started.apparatus_how_to.description", + "hide_while_locked": false, + "icon": "theurgy:pyromantic_brazier", + "name": "book.theurgy.the_hermetica.getting_started.apparatus_how_to.name", + "pages": [ + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.apparatus_how_to.intro.text", + "title": "book.theurgy.the_hermetica.getting_started.apparatus_how_to.intro.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.apparatus_how_to.intro2.text", + "title": "", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.apparatus_how_to.manual_interaction.text", + "title": "book.theurgy.the_hermetica.getting_started.apparatus_how_to.manual_interaction.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.apparatus_how_to.manual_interaction2.text", + "title": "", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.apparatus_how_to.fluid_interaction.text", + "title": "book.theurgy.the_hermetica.getting_started.apparatus_how_to.fluid_interaction.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.apparatus_how_to.automatic_interaction.text", + "title": "book.theurgy.the_hermetica.getting_started.apparatus_how_to.automatic_interaction.title", + "use_markdown_in_title": false + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:getting_started/spagyrics", + "line_enabled": true, + "line_reversed": false + } + ], + "x": -3, + "y": 5 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/create_mercury.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/create_mercury.json new file mode 100644 index 000000000..0bfba8c01 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/create_mercury.json @@ -0,0 +1,54 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:getting_started", + "description": "book.theurgy.the_hermetica.getting_started.create_mercury.description", + "hide_while_locked": false, + "icon": "theurgy:mercury_shard", + "name": "book.theurgy.the_hermetica.getting_started.create_mercury.name", + "pages": [ + { + "type": "modonomicon:spotlight", + "anchor": "", + "item": { + "item": "theurgy:mercury_shard" + }, + "text": "book.theurgy.the_hermetica.getting_started.create_mercury.intro.text", + "title": "" + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.create_mercury.step1.text", + "title": "book.theurgy.the_hermetica.getting_started.create_mercury.step1.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.create_mercury.step2.text", + "title": "book.theurgy.the_hermetica.getting_started.create_mercury.step2.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.create_mercury.step3.text", + "title": "book.theurgy.the_hermetica.getting_started.create_mercury.step3.title", + "use_markdown_in_title": false + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:getting_started/needed_apparatus", + "line_enabled": true, + "line_reversed": false + } + ], + "x": 7, + "y": 5 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/create_salt.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/create_salt.json new file mode 100644 index 000000000..d3768423c --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/create_salt.json @@ -0,0 +1,54 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:getting_started", + "description": "book.theurgy.the_hermetica.getting_started.create_salt.description", + "hide_while_locked": false, + "icon": "theurgy:alchemical_salt_mineral", + "name": "book.theurgy.the_hermetica.getting_started.create_salt.name", + "pages": [ + { + "type": "modonomicon:spotlight", + "anchor": "", + "item": { + "item": "theurgy:alchemical_salt_mineral" + }, + "text": "book.theurgy.the_hermetica.getting_started.create_salt.intro.text", + "title": "" + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.create_salt.step1.text", + "title": "book.theurgy.the_hermetica.getting_started.create_salt.step1.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.create_salt.step2.text", + "title": "book.theurgy.the_hermetica.getting_started.create_salt.step2.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.create_salt.step3.text", + "title": "book.theurgy.the_hermetica.getting_started.create_salt.step3.title", + "use_markdown_in_title": false + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:getting_started/needed_apparatus", + "line_enabled": true, + "line_reversed": false + } + ], + "x": 9, + "y": 3 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/create_solvent.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/create_solvent.json new file mode 100644 index 000000000..8992ea78b --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/create_solvent.json @@ -0,0 +1,54 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:getting_started", + "description": "book.theurgy.the_hermetica.getting_started.create_solvent.description", + "hide_while_locked": false, + "icon": "theurgy:sal_ammoniac_bucket", + "name": "book.theurgy.the_hermetica.getting_started.create_solvent.name", + "pages": [ + { + "type": "modonomicon:spotlight", + "anchor": "", + "item": { + "item": "theurgy:sal_ammoniac_bucket" + }, + "text": "book.theurgy.the_hermetica.getting_started.create_solvent.intro.text", + "title": "" + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.create_solvent.step1.text", + "title": "book.theurgy.the_hermetica.getting_started.create_solvent.step1.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.create_solvent.step2.text", + "title": "book.theurgy.the_hermetica.getting_started.create_solvent.step2.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.create_solvent.step3.text", + "title": "book.theurgy.the_hermetica.getting_started.create_solvent.step3.title", + "use_markdown_in_title": false + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:getting_started/needed_apparatus", + "line_enabled": true, + "line_reversed": false + } + ], + "x": 7, + "y": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/create_sulfur.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/create_sulfur.json new file mode 100644 index 000000000..f59db88d2 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/create_sulfur.json @@ -0,0 +1,62 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:getting_started", + "description": "book.theurgy.the_hermetica.getting_started.create_sulfur.description", + "hide_while_locked": false, + "icon": "theurgy:alchemical_sulfur_iron", + "name": "book.theurgy.the_hermetica.getting_started.create_sulfur.name", + "pages": [ + { + "type": "modonomicon:spotlight", + "anchor": "", + "item": { + "item": "theurgy:alchemical_sulfur_iron" + }, + "text": "book.theurgy.the_hermetica.getting_started.create_sulfur.intro.text", + "title": "" + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.create_sulfur.step1.text", + "title": "book.theurgy.the_hermetica.getting_started.create_sulfur.step1.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.create_sulfur.step2.text", + "title": "book.theurgy.the_hermetica.getting_started.create_sulfur.step2.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.create_sulfur.step3.text", + "title": "book.theurgy.the_hermetica.getting_started.create_sulfur.step3.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.create_sulfur.step4.text", + "title": "book.theurgy.the_hermetica.getting_started.create_sulfur.step4.title", + "use_markdown_in_title": false + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:getting_started/create_solvent", + "line_enabled": true, + "line_reversed": false + } + ], + "x": 9, + "y": 1 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/divination_rod.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/divination_rod.json deleted file mode 100644 index d52aaa115..000000000 --- a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/divination_rod.json +++ /dev/null @@ -1,62 +0,0 @@ -{ - "background_u_index": 0, - "background_v_index": 0, - "category": "theurgy:getting_started", - "description": "book.theurgy.the_hermetica.getting_started.divination_rod.description", - "hide_while_locked": false, - "icon": "theurgy:divination_rod_t1", - "name": "book.theurgy.the_hermetica.getting_started.divination_rod.name", - "pages": [ - { - "type": "modonomicon:spotlight", - "anchor": "", - "item": { - "item": "theurgy:divination_rod_t1" - }, - "text": "book.theurgy.the_hermetica.getting_started.divination_rod.intro.text", - "title": "" - }, - { - "type": "modonomicon:text", - "anchor": "", - "show_title_separator": true, - "text": "book.theurgy.the_hermetica.getting_started.divination_rod.intro2.text", - "title": "", - "use_markdown_in_title": false - }, - { - "type": "modonomicon:crafting_recipe", - "anchor": "", - "recipe_id_1": "theurgy:crafting/shaped/divination_rod_t1", - "text": "book.theurgy.the_hermetica.getting_started.divination_rod.recipe.text", - "title1": "", - "title2": "" - }, - { - "type": "modonomicon:text", - "anchor": "", - "show_title_separator": true, - "text": "book.theurgy.the_hermetica.getting_started.divination_rod.supported_blocks.text", - "title": "book.theurgy.the_hermetica.getting_started.divination_rod.supported_blocks.title", - "use_markdown_in_title": false - }, - { - "type": "modonomicon:text", - "anchor": "", - "show_title_separator": true, - "text": "book.theurgy.the_hermetica.getting_started.divination_rod.usage.text", - "title": "book.theurgy.the_hermetica.getting_started.divination_rod.usage.title", - "use_markdown_in_title": false - } - ], - "parents": [ - { - "draw_arrow": true, - "entry": "theurgy:getting_started/intro", - "line_enabled": true, - "line_reversed": false - } - ], - "x": -3, - "y": 0 -} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/incubation.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/incubation.json new file mode 100644 index 000000000..9a31b5874 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/incubation.json @@ -0,0 +1,65 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:getting_started", + "description": "book.theurgy.the_hermetica.getting_started.incubation.description", + "hide_while_locked": false, + "icon": "minecraft:iron_ingot", + "name": "book.theurgy.the_hermetica.getting_started.incubation.name", + "pages": [ + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.incubation.intro.text", + "title": "book.theurgy.the_hermetica.getting_started.incubation.intro.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.incubation.step1.text", + "title": "book.theurgy.the_hermetica.getting_started.incubation.step1.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.incubation.step2.text", + "title": "book.theurgy.the_hermetica.getting_started.incubation.step2.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.incubation.step3.text", + "title": "book.theurgy.the_hermetica.getting_started.incubation.step3.title", + "use_markdown_in_title": false + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:getting_started/create_mercury", + "line_enabled": true, + "line_reversed": false + }, + { + "draw_arrow": true, + "entry": "theurgy:getting_started/create_salt", + "line_enabled": true, + "line_reversed": false + }, + { + "draw_arrow": true, + "entry": "theurgy:getting_started/create_sulfur", + "line_enabled": true, + "line_reversed": false + } + ], + "x": 11, + "y": 3 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/intro.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/intro.json index 0e7616672..029a653d4 100644 --- a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/intro.json +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/intro.json @@ -25,5 +25,5 @@ } ], "x": -7, - "y": 0 + "y": 1 } \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/needed_apparatus.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/needed_apparatus.json new file mode 100644 index 000000000..d575c030f --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/needed_apparatus.json @@ -0,0 +1,100 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:getting_started", + "description": "book.theurgy.the_hermetica.getting_started.needed_apparatus.description", + "hide_while_locked": false, + "icon": "theurgy:distiller", + "name": "book.theurgy.the_hermetica.getting_started.needed_apparatus.name", + "pages": [ + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.needed_apparatus.intro.text", + "title": "book.theurgy.the_hermetica.getting_started.needed_apparatus.intro.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:spotlight", + "anchor": "", + "item": { + "item": "theurgy:pyromantic_brazier" + }, + "text": "book.theurgy.the_hermetica.getting_started.needed_apparatus.pyromantic_brazier.text", + "title": "" + }, + { + "type": "modonomicon:spotlight", + "anchor": "", + "item": { + "item": "theurgy:calcination_oven" + }, + "text": "book.theurgy.the_hermetica.getting_started.needed_apparatus.calcination_oven.text", + "title": "" + }, + { + "type": "modonomicon:spotlight", + "anchor": "", + "item": { + "item": "theurgy:sal_ammoniac_accumulator" + }, + "text": "book.theurgy.the_hermetica.getting_started.needed_apparatus.sal_ammoniac_accumulator.text", + "title": "" + }, + { + "type": "modonomicon:spotlight", + "anchor": "", + "item": { + "item": "theurgy:sal_ammoniac_tank" + }, + "text": "book.theurgy.the_hermetica.getting_started.needed_apparatus.sal_ammoniac_tank.text", + "title": "" + }, + { + "type": "modonomicon:spotlight", + "anchor": "", + "item": { + "item": "theurgy:liquefaction_cauldron" + }, + "text": "book.theurgy.the_hermetica.getting_started.needed_apparatus.liquefaction_cauldron.text", + "title": "" + }, + { + "type": "modonomicon:spotlight", + "anchor": "", + "item": { + "item": "theurgy:distiller" + }, + "text": "book.theurgy.the_hermetica.getting_started.needed_apparatus.distiller.text", + "title": "" + }, + { + "type": "modonomicon:spotlight", + "anchor": "", + "item": { + "item": "theurgy:incubator" + }, + "text": "book.theurgy.the_hermetica.getting_started.needed_apparatus.incubator.text", + "title": "" + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.needed_apparatus.next_steps.text", + "title": "book.theurgy.the_hermetica.getting_started.needed_apparatus.next_steps.title", + "use_markdown_in_title": false + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:getting_started/about_ore_refining", + "line_enabled": true, + "line_reversed": false + } + ], + "x": 5, + "y": 3 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/precious_sulfur_attuned_divination_rod.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/precious_sulfur_attuned_divination_rod.json new file mode 100644 index 000000000..cf1b02913 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/precious_sulfur_attuned_divination_rod.json @@ -0,0 +1,38 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:getting_started", + "description": "book.theurgy.the_hermetica.getting_started.precious_sulfur_attuned_divination_rod.description", + "hide_while_locked": false, + "icon": "theurgy:sulfur_attuned_divination_rod_precious", + "name": "book.theurgy.the_hermetica.getting_started.precious_sulfur_attuned_divination_rod.name", + "pages": [ + { + "type": "modonomicon:spotlight", + "anchor": "", + "item": { + "item": "theurgy:sulfur_attuned_divination_rod_precious" + }, + "text": "book.theurgy.the_hermetica.getting_started.precious_sulfur_attuned_divination_rod.intro.text", + "title": "" + }, + { + "type": "modonomicon:crafting_recipe", + "anchor": "", + "recipe_id_1": "theurgy:crafting/shaped/sulfur_attuned_divination_rod_precious", + "text": "book.theurgy.the_hermetica.getting_started.precious_sulfur_attuned_divination_rod.recipe.text", + "title1": "", + "title2": "" + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:getting_started/rare_sulfur_attuned_divination_rod", + "line_enabled": true, + "line_reversed": false + } + ], + "x": 7, + "y": -2 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/rare_sulfur_attuned_divination_rod.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/rare_sulfur_attuned_divination_rod.json new file mode 100644 index 000000000..d32577f24 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/rare_sulfur_attuned_divination_rod.json @@ -0,0 +1,38 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:getting_started", + "description": "book.theurgy.the_hermetica.getting_started.rare_sulfur_attuned_divination_rod.description", + "hide_while_locked": false, + "icon": "theurgy:sulfur_attuned_divination_rod_rare", + "name": "book.theurgy.the_hermetica.getting_started.rare_sulfur_attuned_divination_rod.name", + "pages": [ + { + "type": "modonomicon:spotlight", + "anchor": "", + "item": { + "item": "theurgy:sulfur_attuned_divination_rod_rare" + }, + "text": "book.theurgy.the_hermetica.getting_started.rare_sulfur_attuned_divination_rod.intro.text", + "title": "" + }, + { + "type": "modonomicon:crafting_recipe", + "anchor": "", + "recipe_id_1": "theurgy:crafting/shaped/sulfur_attuned_divination_rod_rare", + "text": "book.theurgy.the_hermetica.getting_started.rare_sulfur_attuned_divination_rod.recipe.text", + "title1": "", + "title2": "" + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:getting_started/amethyst_divination_rod", + "line_enabled": true, + "line_reversed": false + } + ], + "x": 5, + "y": -2 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/spagyrics.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/spagyrics.json new file mode 100644 index 000000000..f80ac54d4 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/spagyrics.json @@ -0,0 +1,37 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:getting_started", + "description": "book.theurgy.the_hermetica.getting_started.spagyrics.description", + "hide_while_locked": false, + "icon": "theurgy:calcination_oven", + "name": "book.theurgy.the_hermetica.getting_started.spagyrics.name", + "pages": [ + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.spagyrics.intro.text", + "title": "book.theurgy.the_hermetica.getting_started.spagyrics.intro.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.spagyrics.intro2.text", + "title": "book.theurgy.the_hermetica.getting_started.spagyrics.intro2.title", + "use_markdown_in_title": false + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:getting_started/about_mod", + "line_enabled": true, + "line_reversed": false + } + ], + "x": -3, + "y": 3 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/spagyrics_link.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/spagyrics_link.json new file mode 100644 index 000000000..2f181af9b --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/spagyrics_link.json @@ -0,0 +1,20 @@ +{ + "background_u_index": 1, + "background_v_index": 1, + "category": "theurgy:getting_started", + "category_to_open": "theurgy:spagyrics", + "description": "book.theurgy.the_hermetica.getting_started.spagyrics_link.description", + "hide_while_locked": false, + "icon": "theurgy:calcination_oven", + "name": "book.theurgy.the_hermetica.getting_started.spagyrics_link.name", + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:getting_started/spagyrics", + "line_enabled": true, + "line_reversed": false + } + ], + "x": -1, + "y": 3 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/t1_divination_rod.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/t1_divination_rod.json new file mode 100644 index 000000000..30ccdc621 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/t1_divination_rod.json @@ -0,0 +1,46 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:getting_started", + "description": "book.theurgy.the_hermetica.getting_started.t1_divination_rod.description", + "hide_while_locked": false, + "icon": "theurgy:divination_rod_t1", + "name": "book.theurgy.the_hermetica.getting_started.t1_divination_rod.name", + "pages": [ + { + "type": "modonomicon:spotlight", + "anchor": "", + "item": { + "item": "theurgy:divination_rod_t1" + }, + "text": "book.theurgy.the_hermetica.getting_started.t1_divination_rod.intro.text", + "title": "" + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.getting_started.t1_divination_rod.supported_blocks.text", + "title": "book.theurgy.the_hermetica.getting_started.t1_divination_rod.supported_blocks.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:crafting_recipe", + "anchor": "", + "recipe_id_1": "theurgy:crafting/shaped/divination_rod_t1", + "text": "book.theurgy.the_hermetica.getting_started.t1_divination_rod.recipe.text", + "title1": "", + "title2": "" + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:getting_started/about_divination_rods", + "line_enabled": true, + "line_reversed": false + } + ], + "x": 1, + "y": -5 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/t2_divination_rod.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/t2_divination_rod.json new file mode 100644 index 000000000..466924cba --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/t2_divination_rod.json @@ -0,0 +1,38 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:getting_started", + "description": "book.theurgy.the_hermetica.getting_started.t2_divination_rod.description", + "hide_while_locked": false, + "icon": "theurgy:divination_rod_t2", + "name": "book.theurgy.the_hermetica.getting_started.t2_divination_rod.name", + "pages": [ + { + "type": "modonomicon:spotlight", + "anchor": "", + "item": { + "item": "theurgy:divination_rod_t2" + }, + "text": "book.theurgy.the_hermetica.getting_started.t2_divination_rod.intro.text", + "title": "" + }, + { + "type": "modonomicon:crafting_recipe", + "anchor": "", + "recipe_id_1": "theurgy:crafting/shaped/divination_rod_t2", + "text": "book.theurgy.the_hermetica.getting_started.t2_divination_rod.recipe.text", + "title1": "", + "title2": "" + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:getting_started/amethyst_divination_rod", + "line_enabled": true, + "line_reversed": false + } + ], + "x": 5, + "y": -5 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/t3_divination_rod.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/t3_divination_rod.json new file mode 100644 index 000000000..d31008304 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/t3_divination_rod.json @@ -0,0 +1,38 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:getting_started", + "description": "book.theurgy.the_hermetica.getting_started.t3_divination_rod.description", + "hide_while_locked": false, + "icon": "theurgy:divination_rod_t3", + "name": "book.theurgy.the_hermetica.getting_started.t3_divination_rod.name", + "pages": [ + { + "type": "modonomicon:spotlight", + "anchor": "", + "item": { + "item": "theurgy:divination_rod_t3" + }, + "text": "book.theurgy.the_hermetica.getting_started.t3_divination_rod.intro.text", + "title": "" + }, + { + "type": "modonomicon:crafting_recipe", + "anchor": "", + "recipe_id_1": "theurgy:crafting/shaped/divination_rod_t3", + "text": "book.theurgy.the_hermetica.getting_started.t3_divination_rod.recipe.text", + "title1": "", + "title2": "" + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:getting_started/t2_divination_rod", + "line_enabled": true, + "line_reversed": false + } + ], + "x": 7, + "y": -5 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/t4_divination_rod.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/t4_divination_rod.json new file mode 100644 index 000000000..9bd5050c2 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/getting_started/t4_divination_rod.json @@ -0,0 +1,38 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:getting_started", + "description": "book.theurgy.the_hermetica.getting_started.t4_divination_rod.description", + "hide_while_locked": false, + "icon": "theurgy:divination_rod_t4", + "name": "book.theurgy.the_hermetica.getting_started.t4_divination_rod.name", + "pages": [ + { + "type": "modonomicon:spotlight", + "anchor": "", + "item": { + "item": "theurgy:divination_rod_t4" + }, + "text": "book.theurgy.the_hermetica.getting_started.t4_divination_rod.intro.text", + "title": "" + }, + { + "type": "modonomicon:crafting_recipe", + "anchor": "", + "recipe_id_1": "theurgy:crafting/shaped/divination_rod_t4", + "text": "book.theurgy.the_hermetica.getting_started.t4_divination_rod.recipe.text", + "title1": "", + "title2": "" + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:getting_started/t3_divination_rod", + "line_enabled": true, + "line_reversed": false + } + ], + "x": 9, + "y": -5 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/about_ore_refining_link.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/about_ore_refining_link.json new file mode 100644 index 000000000..bb6261da0 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/about_ore_refining_link.json @@ -0,0 +1,20 @@ +{ + "background_u_index": 1, + "background_v_index": 1, + "category": "theurgy:spagyrics", + "category_to_open": "theurgy:getting_started", + "description": "book.theurgy.the_hermetica.spagyrics.about_ore_refining_link.description", + "hide_while_locked": false, + "icon": "minecraft:raw_iron", + "name": "book.theurgy.the_hermetica.spagyrics.about_ore_refining_link.name", + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:spagyrics/incubator", + "line_enabled": true, + "line_reversed": false + } + ], + "x": 7, + "y": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/calcination_oven.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/calcination_oven.json new file mode 100644 index 000000000..6290e166c --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/calcination_oven.json @@ -0,0 +1,63 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:spagyrics", + "description": "book.theurgy.the_hermetica.spagyrics.calcination_oven.description", + "hide_while_locked": false, + "icon": "theurgy:calcination_oven", + "name": "book.theurgy.the_hermetica.spagyrics.calcination_oven.name", + "pages": [ + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.spagyrics.calcination_oven.intro.text", + "title": "book.theurgy.the_hermetica.spagyrics.calcination_oven.intro.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:multiblock", + "anchor": "", + "multiblock_id": "theurgy:placement/calcination_oven", + "multiblock_name": "", + "show_visualize_button": true, + "text": "" + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.spagyrics.calcination_oven.usage.text", + "title": "book.theurgy.the_hermetica.spagyrics.calcination_oven.usage.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:crafting_recipe", + "anchor": "", + "recipe_id_1": "theurgy:crafting/shaped/calcination_oven", + "text": "", + "title1": "", + "title2": "" + }, + { + "type": "modonomicon:image", + "anchor": "", + "border": true, + "images": [ + "theurgy:textures/gui/book/calcination_oven_working.png" + ], + "text": "book.theurgy.the_hermetica.spagyrics.calcination_oven.working.text", + "title": "book.theurgy.the_hermetica.spagyrics.calcination_oven.working.title" + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:spagyrics/pyromantic_brazier", + "line_enabled": true, + "line_reversed": false + } + ], + "x": -1, + "y": -2 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/distiller.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/distiller.json new file mode 100644 index 000000000..25f1b8541 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/distiller.json @@ -0,0 +1,63 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:spagyrics", + "description": "book.theurgy.the_hermetica.spagyrics.distiller.description", + "hide_while_locked": false, + "icon": "theurgy:distiller", + "name": "book.theurgy.the_hermetica.spagyrics.distiller.name", + "pages": [ + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.spagyrics.distiller.intro.text", + "title": "book.theurgy.the_hermetica.spagyrics.distiller.intro.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:multiblock", + "anchor": "", + "multiblock_id": "theurgy:placement/distiller", + "multiblock_name": "", + "show_visualize_button": true, + "text": "" + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.spagyrics.distiller.usage.text", + "title": "book.theurgy.the_hermetica.spagyrics.distiller.usage.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:crafting_recipe", + "anchor": "", + "recipe_id_1": "theurgy:crafting/shaped/distiller", + "text": "", + "title1": "", + "title2": "" + }, + { + "type": "modonomicon:image", + "anchor": "", + "border": true, + "images": [ + "theurgy:textures/gui/book/distiller_working.png" + ], + "text": "book.theurgy.the_hermetica.spagyrics.distiller.working.text", + "title": "book.theurgy.the_hermetica.spagyrics.distiller.working.title" + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:spagyrics/pyromantic_brazier", + "line_enabled": true, + "line_reversed": false + } + ], + "x": -1, + "y": 2 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/incubator.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/incubator.json new file mode 100644 index 000000000..268bb5123 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/incubator.json @@ -0,0 +1,99 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:spagyrics", + "description": "book.theurgy.the_hermetica.spagyrics.incubator.description", + "hide_while_locked": false, + "icon": "theurgy:incubator", + "name": "book.theurgy.the_hermetica.spagyrics.incubator.name", + "pages": [ + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.spagyrics.incubator.intro.text", + "title": "book.theurgy.the_hermetica.spagyrics.incubator.intro.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:multiblock", + "anchor": "", + "multiblock_id": "theurgy:placement/incubator", + "multiblock_name": "", + "show_visualize_button": true, + "text": "" + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.spagyrics.incubator.usage.text", + "title": "book.theurgy.the_hermetica.spagyrics.incubator.usage.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:crafting_recipe", + "anchor": "", + "recipe_id_1": "theurgy:crafting/shaped/incubator", + "text": "", + "title1": "", + "title2": "" + }, + { + "type": "modonomicon:crafting_recipe", + "anchor": "", + "recipe_id_1": "theurgy:crafting/shaped/incubator_mercury_vessel", + "text": "", + "title1": "", + "title2": "" + }, + { + "type": "modonomicon:crafting_recipe", + "anchor": "", + "recipe_id_1": "theurgy:crafting/shaped/incubator_salt_vessel", + "text": "", + "title1": "", + "title2": "" + }, + { + "type": "modonomicon:crafting_recipe", + "anchor": "", + "recipe_id_1": "theurgy:crafting/shaped/incubator_sulfur_vessel", + "text": "", + "title1": "", + "title2": "" + }, + { + "type": "modonomicon:image", + "anchor": "", + "border": true, + "images": [ + "theurgy:textures/gui/book/incubator_working.png" + ], + "text": "book.theurgy.the_hermetica.spagyrics.incubator.working.text", + "title": "book.theurgy.the_hermetica.spagyrics.incubator.working.title" + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:spagyrics/calcination_oven", + "line_enabled": true, + "line_reversed": false + }, + { + "draw_arrow": true, + "entry": "theurgy:spagyrics/liquefaction_cauldron", + "line_enabled": true, + "line_reversed": false + }, + { + "draw_arrow": true, + "entry": "theurgy:spagyrics/distiller", + "line_enabled": true, + "line_reversed": false + } + ], + "x": 5, + "y": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/intro.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/intro.json new file mode 100644 index 000000000..59e3ce75c --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/intro.json @@ -0,0 +1,29 @@ +{ + "background_u_index": 0, + "background_v_index": 1, + "category": "theurgy:spagyrics", + "description": "book.theurgy.the_hermetica.spagyrics.intro.description", + "hide_while_locked": false, + "icon": "theurgy:calcination_oven", + "name": "book.theurgy.the_hermetica.spagyrics.intro.name", + "pages": [ + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.spagyrics.intro.intro.text", + "title": "book.theurgy.the_hermetica.spagyrics.intro.intro.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.spagyrics.intro.intro2.text", + "title": "book.theurgy.the_hermetica.spagyrics.intro.intro2.title", + "use_markdown_in_title": false + } + ], + "x": -7, + "y": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/liquefaction_cauldron.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/liquefaction_cauldron.json new file mode 100644 index 000000000..07bc18908 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/liquefaction_cauldron.json @@ -0,0 +1,63 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:spagyrics", + "description": "book.theurgy.the_hermetica.spagyrics.liquefaction_cauldron.description", + "hide_while_locked": false, + "icon": "theurgy:liquefaction_cauldron", + "name": "book.theurgy.the_hermetica.spagyrics.liquefaction_cauldron.name", + "pages": [ + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.spagyrics.liquefaction_cauldron.intro.text", + "title": "book.theurgy.the_hermetica.spagyrics.liquefaction_cauldron.intro.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:multiblock", + "anchor": "", + "multiblock_id": "theurgy:placement/liquefaction_cauldron", + "multiblock_name": "", + "show_visualize_button": true, + "text": "" + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.spagyrics.liquefaction_cauldron.usage.text", + "title": "book.theurgy.the_hermetica.spagyrics.liquefaction_cauldron.usage.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:crafting_recipe", + "anchor": "", + "recipe_id_1": "theurgy:crafting/shaped/liquefaction_cauldron", + "text": "", + "title1": "", + "title2": "" + }, + { + "type": "modonomicon:image", + "anchor": "", + "border": true, + "images": [ + "theurgy:textures/gui/book/liquefaction_cauldron_working.png" + ], + "text": "book.theurgy.the_hermetica.spagyrics.liquefaction_cauldron.working.text", + "title": "book.theurgy.the_hermetica.spagyrics.liquefaction_cauldron.working.title" + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:spagyrics/solvents", + "line_enabled": true, + "line_reversed": false + } + ], + "x": 3, + "y": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/principles.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/principles.json new file mode 100644 index 000000000..f037cf857 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/principles.json @@ -0,0 +1,53 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:spagyrics", + "description": "book.theurgy.the_hermetica.spagyrics.principles.description", + "hide_while_locked": false, + "icon": "theurgy:mercury_crystal", + "name": "book.theurgy.the_hermetica.spagyrics.principles.name", + "pages": [ + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.spagyrics.principles.intro.text", + "title": "book.theurgy.the_hermetica.spagyrics.principles.intro.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.spagyrics.principles.salt.text", + "title": "book.theurgy.the_hermetica.spagyrics.principles.salt.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.spagyrics.principles.sulfur.text", + "title": "book.theurgy.the_hermetica.spagyrics.principles.sulfur.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.spagyrics.principles.mercury.text", + "title": "book.theurgy.the_hermetica.spagyrics.principles.mercury.title", + "use_markdown_in_title": false + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:spagyrics/intro", + "line_enabled": true, + "line_reversed": false + } + ], + "x": -5, + "y": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/pyromantic_brazier.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/pyromantic_brazier.json new file mode 100644 index 000000000..3e0a86452 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/pyromantic_brazier.json @@ -0,0 +1,45 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:spagyrics", + "description": "book.theurgy.the_hermetica.spagyrics.pyromantic_brazier.description", + "hide_while_locked": false, + "icon": "theurgy:pyromantic_brazier", + "name": "book.theurgy.the_hermetica.spagyrics.pyromantic_brazier.name", + "pages": [ + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.spagyrics.pyromantic_brazier.intro.text", + "title": "book.theurgy.the_hermetica.spagyrics.pyromantic_brazier.intro.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.spagyrics.pyromantic_brazier.usage.text", + "title": "book.theurgy.the_hermetica.spagyrics.pyromantic_brazier.usage.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:crafting_recipe", + "anchor": "", + "recipe_id_1": "theurgy:crafting/shaped/pyromantic_brazier", + "text": "", + "title1": "", + "title2": "" + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:spagyrics/principles", + "line_enabled": true, + "line_reversed": false + } + ], + "x": -3, + "y": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/solvents.json b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/solvents.json new file mode 100644 index 000000000..0baf4f573 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/books/the_hermetica/entries/spagyrics/solvents.json @@ -0,0 +1,98 @@ +{ + "background_u_index": 0, + "background_v_index": 0, + "category": "theurgy:spagyrics", + "description": "book.theurgy.the_hermetica.spagyrics.solvents.description", + "hide_while_locked": false, + "icon": "theurgy:sal_ammoniac_tank", + "name": "book.theurgy.the_hermetica.spagyrics.solvents.name", + "pages": [ + { + "type": "modonomicon:spotlight", + "anchor": "", + "item": { + "item": "theurgy:sal_ammoniac_bucket" + }, + "text": "book.theurgy.the_hermetica.spagyrics.solvents.intro.text", + "title": "book.theurgy.the_hermetica.spagyrics.solvents.intro.title" + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.spagyrics.solvents.crafting.text", + "title": "book.theurgy.the_hermetica.spagyrics.solvents.crafting.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:multiblock", + "anchor": "", + "multiblock_id": "theurgy:placement/sal_ammoniac_accumulator", + "multiblock_name": "", + "show_visualize_button": true, + "text": "" + }, + { + "type": "modonomicon:text", + "anchor": "", + "show_title_separator": true, + "text": "book.theurgy.the_hermetica.spagyrics.solvents.usage.text", + "title": "book.theurgy.the_hermetica.spagyrics.solvents.usage.title", + "use_markdown_in_title": false + }, + { + "type": "modonomicon:crafting_recipe", + "anchor": "", + "recipe_id_1": "theurgy:crafting/shaped/sal_ammoniac_accumulator", + "text": "", + "title1": "", + "title2": "" + }, + { + "type": "modonomicon:crafting_recipe", + "anchor": "", + "recipe_id_1": "theurgy:crafting/shaped/sal_ammoniac_tank", + "text": "", + "title1": "", + "title2": "" + }, + { + "type": "modonomicon:image", + "anchor": "", + "border": true, + "images": [ + "theurgy:textures/gui/book/256.png" + ], + "text": "book.theurgy.the_hermetica.spagyrics.solvents.working.text", + "title": "book.theurgy.the_hermetica.spagyrics.solvents.working.title" + }, + { + "type": "modonomicon:spotlight", + "anchor": "", + "item": { + "item": "theurgy:sal_ammoniac_crystal" + }, + "text": "book.theurgy.the_hermetica.spagyrics.solvents.sal_ammoniac_crystal.text", + "title": "" + }, + { + "type": "theurgy:accumulation_recipe", + "anchor": "", + "recipe_id_1": "theurgy:accumulation/sal_ammoniac_from_water", + "recipe_id_2": "theurgy:accumulation/sal_ammoniac_from_water_and_sal_ammoniac_crystal", + "text": "", + "title1": "", + "title2": "book.theurgy.the_hermetica.spagyrics.solvents.sal_ammoniac_fluid_recipe.title.2" + } + ], + "parents": [ + { + "draw_arrow": true, + "entry": "theurgy:spagyrics/pyromantic_brazier", + "line_enabled": true, + "line_reversed": false + } + ], + "x": 1, + "y": 0 +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/multiblocks/placement/calcination_oven.json b/src/generated/resources/data/theurgy/modonomicon/multiblocks/placement/calcination_oven.json new file mode 100644 index 000000000..341271a67 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/multiblocks/placement/calcination_oven.json @@ -0,0 +1,38 @@ +{ + "type": "modonomicon:dense", + "mapping": { + "*": { + "type": "modonomicon:display", + "display": "minecraft:basalt" + }, + "+": { + "type": "modonomicon:display", + "display": "minecraft:stone" + }, + "0": { + "type": "modonomicon:block", + "block": "theurgy:calcination_oven" + }, + "b": { + "type": "modonomicon:block", + "block": "theurgy:pyromantic_brazier" + } + }, + "pattern": [ + [ + "___", + "_0_", + "___" + ], + [ + "___", + "_b_", + "___" + ], + [ + "*+*", + "+*+", + "*+*" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/multiblocks/placement/distiller.json b/src/generated/resources/data/theurgy/modonomicon/multiblocks/placement/distiller.json new file mode 100644 index 000000000..f0fec1a83 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/multiblocks/placement/distiller.json @@ -0,0 +1,38 @@ +{ + "type": "modonomicon:dense", + "mapping": { + "*": { + "type": "modonomicon:display", + "display": "minecraft:basalt" + }, + "+": { + "type": "modonomicon:display", + "display": "minecraft:stone" + }, + "0": { + "type": "modonomicon:block", + "block": "theurgy:distiller" + }, + "b": { + "type": "modonomicon:block", + "block": "theurgy:pyromantic_brazier" + } + }, + "pattern": [ + [ + "___", + "_0_", + "___" + ], + [ + "___", + "_b_", + "___" + ], + [ + "*+*", + "+*+", + "*+*" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/multiblocks/placement/incubator.json b/src/generated/resources/data/theurgy/modonomicon/multiblocks/placement/incubator.json new file mode 100644 index 000000000..eebf07a4c --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/multiblocks/placement/incubator.json @@ -0,0 +1,57 @@ +{ + "type": "modonomicon:dense", + "mapping": { + "*": { + "type": "modonomicon:display", + "display": "minecraft:basalt" + }, + "+": { + "type": "modonomicon:display", + "display": "minecraft:stone" + }, + "0": { + "type": "modonomicon:block", + "block": "theurgy:incubator", + "display": "theurgy:incubator[north=true,east=false,south=true,west=true]" + }, + "M": { + "type": "modonomicon:block", + "block": "theurgy:incubator_mercury_vessel" + }, + "S": { + "type": "modonomicon:block", + "block": "theurgy:incubator_salt_vessel" + }, + "b": { + "type": "modonomicon:block", + "block": "theurgy:pyromantic_brazier" + }, + "s": { + "type": "modonomicon:block", + "block": "theurgy:incubator_sulfur_vessel" + } + }, + "pattern": [ + [ + "_____", + "__M__", + "_S0s_", + "_____", + "_____" + ], + [ + "_____", + "_____", + "__b__", + "_____", + "_____" + ], + [ + "*+*+*", + "+*+*+", + "*+*+*", + "+*+*+", + "*+*+*" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/multiblocks/placement/liquefaction_cauldron.json b/src/generated/resources/data/theurgy/modonomicon/multiblocks/placement/liquefaction_cauldron.json new file mode 100644 index 000000000..978022119 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/multiblocks/placement/liquefaction_cauldron.json @@ -0,0 +1,38 @@ +{ + "type": "modonomicon:dense", + "mapping": { + "*": { + "type": "modonomicon:display", + "display": "minecraft:basalt" + }, + "+": { + "type": "modonomicon:display", + "display": "minecraft:stone" + }, + "0": { + "type": "modonomicon:block", + "block": "theurgy:liquefaction_cauldron" + }, + "b": { + "type": "modonomicon:block", + "block": "theurgy:pyromantic_brazier" + } + }, + "pattern": [ + [ + "___", + "_0_", + "___" + ], + [ + "___", + "_b_", + "___" + ], + [ + "*+*", + "+*+", + "*+*" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/multiblocks/placement/pyromantic_brazier.json b/src/generated/resources/data/theurgy/modonomicon/multiblocks/placement/pyromantic_brazier.json new file mode 100644 index 000000000..86b9c9bd8 --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/multiblocks/placement/pyromantic_brazier.json @@ -0,0 +1,29 @@ +{ + "type": "modonomicon:dense", + "mapping": { + "*": { + "type": "modonomicon:display", + "display": "minecraft:basalt" + }, + "+": { + "type": "modonomicon:display", + "display": "minecraft:stone" + }, + "0": { + "type": "modonomicon:block", + "block": "theurgy:pyromantic_brazier" + } + }, + "pattern": [ + [ + "___", + "_0_", + "___" + ], + [ + "*+*", + "+*+", + "*+*" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/modonomicon/multiblocks/placement/sal_ammoniac_accumulator.json b/src/generated/resources/data/theurgy/modonomicon/multiblocks/placement/sal_ammoniac_accumulator.json new file mode 100644 index 000000000..e1f055cea --- /dev/null +++ b/src/generated/resources/data/theurgy/modonomicon/multiblocks/placement/sal_ammoniac_accumulator.json @@ -0,0 +1,38 @@ +{ + "type": "modonomicon:dense", + "mapping": { + "*": { + "type": "modonomicon:display", + "display": "minecraft:basalt" + }, + "+": { + "type": "modonomicon:display", + "display": "minecraft:stone" + }, + "0": { + "type": "modonomicon:block", + "block": "theurgy:sal_ammoniac_accumulator" + }, + "b": { + "type": "modonomicon:block", + "block": "theurgy:sal_ammoniac_tank" + } + }, + "pattern": [ + [ + "___", + "_0_", + "___" + ], + [ + "___", + "_b_", + "___" + ], + [ + "*+*", + "+*+", + "*+*" + ] + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/accumulation/sal_ammoniac_from_water.json b/src/generated/resources/data/theurgy/recipes/accumulation/sal_ammoniac_from_water.json new file mode 100644 index 000000000..bbc9e4e30 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/accumulation/sal_ammoniac_from_water.json @@ -0,0 +1,12 @@ +{ + "type": "theurgy:accumulation", + "accumulation_time": 200, + "evaporant": { + "amount": 1000, + "tag": "minecraft:water" + }, + "result": { + "Amount": 100, + "FluidName": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/accumulation/sal_ammoniac_from_water_and_sal_ammoniac_crystal.json b/src/generated/resources/data/theurgy/recipes/accumulation/sal_ammoniac_from_water_and_sal_ammoniac_crystal.json new file mode 100644 index 000000000..7c846bb8d --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/accumulation/sal_ammoniac_from_water_and_sal_ammoniac_crystal.json @@ -0,0 +1,15 @@ +{ + "type": "theurgy:accumulation", + "accumulation_time": 200, + "evaporant": { + "amount": 1000, + "tag": "minecraft:water" + }, + "result": { + "Amount": 1000, + "FluidName": "theurgy:sal_ammoniac" + }, + "solute": { + "tag": "forge:gems/sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/calcination/crops.json b/src/generated/resources/data/theurgy/recipes/calcination/crops.json new file mode 100644 index 000000000..ce552e09e --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/calcination/crops.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:calcination", + "calcination_time": 200, + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:crops" + } + } + ], + "ingredient": { + "tag": "forge:crops" + }, + "ingredient_count": 1, + "result": { + "count": 1, + "item": "theurgy:alchemical_salt_crops" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/calcination/mineral.json b/src/generated/resources/data/theurgy/recipes/calcination/mineral.json new file mode 100644 index 000000000..31ac72496 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/calcination/mineral.json @@ -0,0 +1,12 @@ +{ + "type": "theurgy:calcination", + "calcination_time": 200, + "ingredient": { + "item": "theurgy:alchemical_salt_strata" + }, + "ingredient_count": 20, + "result": { + "count": 1, + "item": "theurgy:alchemical_salt_mineral" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_gems.json b/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_gems.json new file mode 100644 index 000000000..19f9c7867 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_gems.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:calcination", + "calcination_time": 200, + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:gems" + } + } + ], + "ingredient": { + "tag": "forge:gems" + }, + "ingredient_count": 1, + "result": { + "count": 2, + "item": "theurgy:alchemical_salt_mineral" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_ingots.json b/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_ingots.json new file mode 100644 index 000000000..1dde1749e --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_ingots.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:calcination", + "calcination_time": 200, + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots" + } + } + ], + "ingredient": { + "tag": "forge:ingots" + }, + "ingredient_count": 1, + "result": { + "count": 2, + "item": "theurgy:alchemical_salt_mineral" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_ores.json b/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_ores.json new file mode 100644 index 000000000..4f69a7baa --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_ores.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:calcination", + "calcination_time": 200, + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores" + } + } + ], + "ingredient": { + "tag": "forge:ores" + }, + "ingredient_count": 1, + "result": { + "count": 1, + "item": "theurgy:alchemical_salt_mineral" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_other_minerals.json b/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_other_minerals.json new file mode 100644 index 000000000..adf1e1d9b --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_other_minerals.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:calcination", + "calcination_time": 200, + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "theurgy:other_minerals" + } + } + ], + "ingredient": { + "tag": "theurgy:other_minerals" + }, + "ingredient_count": 1, + "result": { + "count": 2, + "item": "theurgy:alchemical_salt_mineral" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_raw_materials.json b/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_raw_materials.json new file mode 100644 index 000000000..eb5b5838b --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/calcination/mineral_from_raw_materials.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:calcination", + "calcination_time": 200, + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:raw_materials" + } + } + ], + "ingredient": { + "tag": "forge:raw_materials" + }, + "ingredient_count": 1, + "result": { + "count": 1, + "item": "theurgy:alchemical_salt_mineral" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/calcination/strata_from_clay.json b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_clay.json new file mode 100644 index 000000000..7a344d410 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_clay.json @@ -0,0 +1,12 @@ +{ + "type": "theurgy:calcination", + "calcination_time": 200, + "ingredient": { + "item": "minecraft:clay" + }, + "ingredient_count": 1, + "result": { + "count": 4, + "item": "theurgy:alchemical_salt_strata" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/calcination/strata_from_clay_ball.json b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_clay_ball.json new file mode 100644 index 000000000..fa2ef5ba3 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_clay_ball.json @@ -0,0 +1,12 @@ +{ + "type": "theurgy:calcination", + "calcination_time": 200, + "ingredient": { + "item": "minecraft:clay_ball" + }, + "ingredient_count": 1, + "result": { + "count": 1, + "item": "theurgy:alchemical_salt_strata" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/calcination/strata_from_cobblestone.json b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_cobblestone.json new file mode 100644 index 000000000..72dcedd55 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_cobblestone.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:calcination", + "calcination_time": 200, + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:cobblestone" + } + } + ], + "ingredient": { + "tag": "forge:cobblestone" + }, + "ingredient_count": 1, + "result": { + "count": 1, + "item": "theurgy:alchemical_salt_strata" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/calcination/strata_from_dirt.json b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_dirt.json new file mode 100644 index 000000000..fb08a8e4c --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_dirt.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:calcination", + "calcination_time": 200, + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "minecraft:dirt" + } + } + ], + "ingredient": { + "tag": "minecraft:dirt" + }, + "ingredient_count": 1, + "result": { + "count": 1, + "item": "theurgy:alchemical_salt_strata" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/calcination/strata_from_gravel.json b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_gravel.json new file mode 100644 index 000000000..999f6b433 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_gravel.json @@ -0,0 +1,12 @@ +{ + "type": "theurgy:calcination", + "calcination_time": 200, + "ingredient": { + "item": "minecraft:gravel" + }, + "ingredient_count": 1, + "result": { + "count": 1, + "item": "theurgy:alchemical_salt_strata" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/calcination/strata_from_sand.json b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_sand.json new file mode 100644 index 000000000..bbaa852a2 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_sand.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:calcination", + "calcination_time": 200, + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "minecraft:sand" + } + } + ], + "ingredient": { + "tag": "minecraft:sand" + }, + "ingredient_count": 1, + "result": { + "count": 1, + "item": "theurgy:alchemical_salt_strata" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/calcination/strata_from_sandstone.json b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_sandstone.json new file mode 100644 index 000000000..f485df0f3 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_sandstone.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:calcination", + "calcination_time": 200, + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:sandstone" + } + } + ], + "ingredient": { + "tag": "forge:sandstone" + }, + "ingredient_count": 1, + "result": { + "count": 1, + "item": "theurgy:alchemical_salt_strata" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/calcination/strata_from_stone.json b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_stone.json new file mode 100644 index 000000000..6aa214543 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/calcination/strata_from_stone.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:calcination", + "calcination_time": 200, + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:stone" + } + } + ], + "ingredient": { + "tag": "forge:stone" + }, + "ingredient_count": 1, + "result": { + "count": 1, + "item": "theurgy:alchemical_salt_strata" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/amethyst_divination_rod.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/amethyst_divination_rod.json new file mode 100644 index 000000000..37257a73e --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/amethyst_divination_rod.json @@ -0,0 +1,32 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "G": { + "tag": "forge:glass" + }, + "P": { + "tag": "forge:dyes/purple" + }, + "R": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + " GP", + " RG", + "R " + ], + "result": { + "count": 1, + "item": "theurgy:amethyst_divination_rod", + "nbt": { + "theurgy:divination.linked_block_id": "minecraft:budding_amethyst", + "theurgy:divination.setting.allowed_blocks_tag": "theurgy:divination_rod_t1_allowed_blocks", + "theurgy:divination.setting.disallowed_blocks_tag": "theurgy:divination_rod_t1_disallowed_blocks", + "theurgy:divination.setting.duration": 40, + "theurgy:divination.setting.max_damage": 16, + "theurgy:divination.setting.range": 96, + "theurgy:divination.setting.tier": "minecraft:stone" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/calcination_oven.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/calcination_oven.json new file mode 100644 index 000000000..e34af3e1d --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/calcination_oven.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "C": { + "tag": "forge:storage_blocks/copper" + }, + "I": { + "tag": "forge:ingots/iron" + } + }, + "pattern": [ + " I ", + "ICI", + " I " + ], + "result": { + "count": 1, + "item": "theurgy:calcination_oven" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/distiller.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/distiller.json new file mode 100644 index 000000000..80df13906 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/distiller.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "C": { + "tag": "forge:storage_blocks/copper" + }, + "I": { + "tag": "forge:ingots/iron" + } + }, + "pattern": [ + " I ", + "ICI", + "III" + ], + "result": { + "count": 1, + "item": "theurgy:distiller" + } +} \ No newline at end of file diff --git a/src/main/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t1.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t1.json similarity index 82% rename from src/main/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t1.json rename to src/generated/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t1.json index ecdec524a..13c482cd9 100644 --- a/src/main/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t1.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t1.json @@ -14,14 +14,15 @@ "R " ], "result": { + "count": 1, "item": "theurgy:divination_rod_t1", "nbt": { - "theurgy:divination.setting.tier": "minecraft:stone", "theurgy:divination.setting.allowed_blocks_tag": "theurgy:divination_rod_t1_allowed_blocks", "theurgy:divination.setting.disallowed_blocks_tag": "theurgy:divination_rod_t1_disallowed_blocks", - "theurgy:divination.setting.range": 96, "theurgy:divination.setting.duration": 40, - "theurgy:divination.setting.max_damage": 3 + "theurgy:divination.setting.max_damage": 8, + "theurgy:divination.setting.range": 96, + "theurgy:divination.setting.tier": "minecraft:stone" } } } \ No newline at end of file diff --git a/src/main/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t2.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t2.json similarity index 84% rename from src/main/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t2.json rename to src/generated/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t2.json index 0923015ee..c79593ce2 100644 --- a/src/main/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t2.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t2.json @@ -1,17 +1,17 @@ { "type": "minecraft:crafting_shaped", "key": { + "A": { + "tag": "forge:gems/amethyst" + }, "G": { "tag": "forge:glass" }, - "R": { - "tag": "forge:rods/wooden" - }, "M": { "tag": "forge:nuggets/gold" }, - "A": { - "tag": "forge:gems/amethyst" + "R": { + "tag": "forge:rods/wooden" } }, "pattern": [ @@ -20,14 +20,15 @@ "R " ], "result": { + "count": 1, "item": "theurgy:divination_rod_t2", "nbt": { - "theurgy:divination.setting.tier": "minecraft:iron", "theurgy:divination.setting.allowed_blocks_tag": "theurgy:divination_rod_t2_allowed_blocks", "theurgy:divination.setting.disallowed_blocks_tag": "theurgy:divination_rod_t2_disallowed_blocks", - "theurgy:divination.setting.range": 96, "theurgy:divination.setting.duration": 40, - "theurgy:divination.setting.max_damage": 6 + "theurgy:divination.setting.max_damage": 16, + "theurgy:divination.setting.range": 96, + "theurgy:divination.setting.tier": "minecraft:iron" } } } \ No newline at end of file diff --git a/src/main/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t3.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t3.json similarity index 84% rename from src/main/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t3.json rename to src/generated/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t3.json index 7bd67b871..c125b5838 100644 --- a/src/main/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t3.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t3.json @@ -1,14 +1,14 @@ { "type": "minecraft:crafting_shaped", "key": { - "G": { - "tag": "forge:glass" + "A": { + "tag": "forge:gems/amethyst" }, "D": { "tag": "forge:gems/diamond" }, - "A": { - "tag": "forge:gems/amethyst" + "G": { + "tag": "forge:glass" }, "Q": { "tag": "forge:gems/quartz" @@ -20,14 +20,15 @@ "A " ], "result": { + "count": 1, "item": "theurgy:divination_rod_t3", "nbt": { - "theurgy:divination.setting.tier": "minecraft:diamond", "theurgy:divination.setting.allowed_blocks_tag": "theurgy:divination_rod_t3_allowed_blocks", "theurgy:divination.setting.disallowed_blocks_tag": "theurgy:divination_rod_t3_disallowed_blocks", - "theurgy:divination.setting.range": 96, "theurgy:divination.setting.duration": 40, - "theurgy:divination.setting.max_damage": 9 + "theurgy:divination.setting.max_damage": 32, + "theurgy:divination.setting.range": 96, + "theurgy:divination.setting.tier": "minecraft:diamond" } } } \ No newline at end of file diff --git a/src/main/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t4.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t4.json similarity index 79% rename from src/main/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t4.json rename to src/generated/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t4.json index 2b9e320e4..2c46aa7d1 100644 --- a/src/main/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t4.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t4.json @@ -1,17 +1,17 @@ { "type": "minecraft:crafting_shaped", "key": { + "A": { + "tag": "forge:gems/amethyst" + }, "G": { "tag": "forge:glass" }, - "R": { - "tag": "forge:rods/blaze" - }, "M": { - "item": "minecraft:netherite_scrap" + "tag": "forge:ores/netherite_scrap" }, - "A": { - "tag": "forge:gems/amethyst" + "R": { + "tag": "forge:rods/blaze" } }, "pattern": [ @@ -20,14 +20,15 @@ "A " ], "result": { + "count": 1, "item": "theurgy:divination_rod_t4", "nbt": { - "theurgy:divination.setting.tier": "minecraft:netherite", "theurgy:divination.setting.allowed_blocks_tag": "theurgy:divination_rod_t4_allowed_blocks", "theurgy:divination.setting.disallowed_blocks_tag": "theurgy:divination_rod_t4_disallowed_blocks", - "theurgy:divination.setting.range": 96, "theurgy:divination.setting.duration": 40, - "theurgy:divination.setting.max_damage": 12 + "theurgy:divination.setting.max_damage": 128, + "theurgy:divination.setting.range": 96, + "theurgy:divination.setting.tier": "minecraft:netherite" } } } \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/incubator.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/incubator.json new file mode 100644 index 000000000..a736e6ffe --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/incubator.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "C": { + "tag": "forge:ingots/copper" + }, + "G": { + "tag": "forge:ingots/gold" + }, + "P": { + "tag": "minecraft:planks" + }, + "S": { + "tag": "forge:stone" + } + }, + "pattern": [ + "PSP", + "GGG", + "SCS" + ], + "result": { + "count": 1, + "item": "theurgy:incubator" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/incubator_mercury_vessel.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/incubator_mercury_vessel.json new file mode 100644 index 000000000..391bad025 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/incubator_mercury_vessel.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "C": { + "tag": "forge:storage_blocks/copper" + }, + "G": { + "tag": "forge:ingots/gold" + }, + "I": { + "tag": "forge:ingots/iron" + }, + "M": { + "tag": "theurgy:alchemical_mercuries" + } + }, + "pattern": [ + "IMI", + "GCG", + "III" + ], + "result": { + "count": 1, + "item": "theurgy:incubator_mercury_vessel" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/incubator_salt_vessel.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/incubator_salt_vessel.json new file mode 100644 index 000000000..f4126fb76 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/incubator_salt_vessel.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "C": { + "tag": "forge:storage_blocks/copper" + }, + "I": { + "tag": "forge:ingots/iron" + }, + "S": { + "tag": "theurgy:alchemical_salts" + }, + "c": { + "tag": "forge:ingots/copper" + } + }, + "pattern": [ + "ISI", + "cCc", + "III" + ], + "result": { + "count": 1, + "item": "theurgy:incubator_salt_vessel" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/incubator_sulfur_vessel.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/incubator_sulfur_vessel.json new file mode 100644 index 000000000..3de99ebf7 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/incubator_sulfur_vessel.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "C": { + "tag": "forge:storage_blocks/copper" + }, + "I": { + "tag": "forge:ingots/iron" + }, + "S": { + "tag": "theurgy:alchemical_sulfurs" + } + }, + "pattern": [ + "ISI", + "ICI", + "III" + ], + "result": { + "count": 1, + "item": "theurgy:incubator_sulfur_vessel" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/liquefaction_cauldron.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/liquefaction_cauldron.json new file mode 100644 index 000000000..665041e09 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/liquefaction_cauldron.json @@ -0,0 +1,26 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "B": { + "item": "minecraft:cauldron" + }, + "C": { + "tag": "forge:ingots/copper" + }, + "I": { + "tag": "forge:ingots/iron" + }, + "S": { + "tag": "forge:stone" + } + }, + "pattern": [ + "CCC", + "IBI", + "SSS" + ], + "result": { + "count": 1, + "item": "theurgy:liquefaction_cauldron" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/pyromantic_brazier.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/pyromantic_brazier.json new file mode 100644 index 000000000..abdd8960f --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/pyromantic_brazier.json @@ -0,0 +1,20 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "C": { + "tag": "forge:ingots/copper" + }, + "S": { + "tag": "forge:stone" + } + }, + "pattern": [ + "CCC", + "CSC", + "SSS" + ], + "result": { + "count": 1, + "item": "theurgy:pyromantic_brazier" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/sal_ammoniac_accumulator.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/sal_ammoniac_accumulator.json new file mode 100644 index 000000000..2f9e60685 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/sal_ammoniac_accumulator.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "C": { + "tag": "forge:storage_blocks/copper" + }, + "I": { + "tag": "forge:ingots/iron" + }, + "S": { + "tag": "forge:stone" + } + }, + "pattern": [ + "ICI", + "SIS", + "S S" + ], + "result": { + "count": 1, + "item": "theurgy:sal_ammoniac_accumulator" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/sal_ammoniac_tank.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/sal_ammoniac_tank.json new file mode 100644 index 000000000..4c037c67b --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/sal_ammoniac_tank.json @@ -0,0 +1,23 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "C": { + "tag": "forge:ingots/copper" + }, + "I": { + "tag": "forge:ingots/iron" + }, + "R": { + "tag": "forge:rods/wooden" + } + }, + "pattern": [ + "ICI", + "ICI", + "RCR" + ], + "result": { + "count": 1, + "item": "theurgy:sal_ammoniac_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_abundant.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_abundant.json new file mode 100644 index 000000000..0f0eee7c2 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_abundant.json @@ -0,0 +1,31 @@ +{ + "type": "theurgy:divination_rod", + "key": { + "G": { + "tag": "forge:glass" + }, + "R": { + "tag": "forge:rods/wooden" + }, + "S": { + "tag": "theurgy:alchemical_sulfurs/abundant" + } + }, + "pattern": [ + " GS", + " RG", + "R " + ], + "result": { + "count": 1, + "item": "theurgy:sulfur_attuned_divination_rod_abundant", + "nbt": { + "theurgy:divination.setting.allowed_blocks_tag": "theurgy:divination_rod_t1_allowed_blocks", + "theurgy:divination.setting.disallowed_blocks_tag": "theurgy:divination_rod_t1_disallowed_blocks", + "theurgy:divination.setting.duration": 40, + "theurgy:divination.setting.max_damage": 16, + "theurgy:divination.setting.range": 96, + "theurgy:divination.setting.tier": "minecraft:stone" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_common.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_common.json new file mode 100644 index 000000000..5c3980cf6 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_common.json @@ -0,0 +1,31 @@ +{ + "type": "theurgy:divination_rod", + "key": { + "G": { + "tag": "forge:glass" + }, + "R": { + "tag": "forge:rods/wooden" + }, + "S": { + "tag": "theurgy:alchemical_sulfurs/common" + } + }, + "pattern": [ + " GS", + " RG", + "R " + ], + "result": { + "count": 1, + "item": "theurgy:sulfur_attuned_divination_rod_common", + "nbt": { + "theurgy:divination.setting.allowed_blocks_tag": "theurgy:divination_rod_t1_allowed_blocks", + "theurgy:divination.setting.disallowed_blocks_tag": "theurgy:divination_rod_t1_disallowed_blocks", + "theurgy:divination.setting.duration": 40, + "theurgy:divination.setting.max_damage": 16, + "theurgy:divination.setting.range": 96, + "theurgy:divination.setting.tier": "minecraft:stone" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_precious.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_precious.json new file mode 100644 index 000000000..da3142a4d --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_precious.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "A": { + "tag": "forge:gems/amethyst" + }, + "D": { + "tag": "forge:gems/diamond" + }, + "G": { + "tag": "forge:glass" + }, + "S": { + "tag": "theurgy:alchemical_sulfurs/precious" + } + }, + "pattern": [ + " GS", + " DG", + "A " + ], + "result": { + "count": 1, + "item": "theurgy:sulfur_attuned_divination_rod_precious", + "nbt": { + "theurgy:divination.setting.allowed_blocks_tag": "theurgy:divination_rod_t3_allowed_blocks", + "theurgy:divination.setting.disallowed_blocks_tag": "theurgy:divination_rod_t3_disallowed_blocks", + "theurgy:divination.setting.duration": 40, + "theurgy:divination.setting.max_damage": 32, + "theurgy:divination.setting.range": 96, + "theurgy:divination.setting.tier": "minecraft:stone" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_rare.json b/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_rare.json new file mode 100644 index 000000000..d98cb5843 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/crafting/shaped/sulfur_attuned_divination_rod_rare.json @@ -0,0 +1,34 @@ +{ + "type": "minecraft:crafting_shaped", + "key": { + "A": { + "tag": "forge:gems/amethyst" + }, + "G": { + "tag": "forge:glass" + }, + "R": { + "tag": "forge:rods/wooden" + }, + "S": { + "tag": "theurgy:alchemical_sulfurs/rare" + } + }, + "pattern": [ + " GS", + " AG", + "R " + ], + "result": { + "count": 1, + "item": "theurgy:sulfur_attuned_divination_rod_rare", + "nbt": { + "theurgy:divination.setting.allowed_blocks_tag": "theurgy:divination_rod_t2_allowed_blocks", + "theurgy:divination.setting.disallowed_blocks_tag": "theurgy:divination_rod_t2_disallowed_blocks", + "theurgy:divination.setting.duration": 40, + "theurgy:divination.setting.max_damage": 32, + "theurgy:divination.setting.range": 96, + "theurgy:divination.setting.tier": "minecraft:stone" + } + } +} \ No newline at end of file diff --git a/src/main/resources/data/theurgy/recipes/crafting/shapeless/the_hermetica.json b/src/generated/resources/data/theurgy/recipes/crafting/shapeless/the_hermetica.json similarity index 95% rename from src/main/resources/data/theurgy/recipes/crafting/shapeless/the_hermetica.json rename to src/generated/resources/data/theurgy/recipes/crafting/shapeless/the_hermetica.json index 8700f01c9..8ccd7d386 100644 --- a/src/main/resources/data/theurgy/recipes/crafting/shapeless/the_hermetica.json +++ b/src/generated/resources/data/theurgy/recipes/crafting/shapeless/the_hermetica.json @@ -12,6 +12,7 @@ } ], "result": { + "count": 1, "item": "modonomicon:modonomicon", "nbt": { "modonomicon:book_id": "theurgy:the_hermetica" diff --git a/src/generated/resources/data/theurgy/recipes/distillation/beef.json b/src/generated/resources/data/theurgy/recipes/distillation/beef.json new file mode 100644 index 000000000..c4f9aa876 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/beef.json @@ -0,0 +1,12 @@ +{ + "type": "theurgy:distillation", + "distillation_time": 200, + "ingredient": { + "item": "minecraft:beef" + }, + "ingredient_count": 2, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/bread.json b/src/generated/resources/data/theurgy/recipes/distillation/bread.json new file mode 100644 index 000000000..6161743b8 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/bread.json @@ -0,0 +1,12 @@ +{ + "type": "theurgy:distillation", + "distillation_time": 200, + "ingredient": { + "item": "minecraft:bread" + }, + "ingredient_count": 1, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/chicken.json b/src/generated/resources/data/theurgy/recipes/distillation/chicken.json new file mode 100644 index 000000000..4f84418d3 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/chicken.json @@ -0,0 +1,12 @@ +{ + "type": "theurgy:distillation", + "distillation_time": 200, + "ingredient": { + "item": "minecraft:chicken" + }, + "ingredient_count": 2, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/cobblestone.json b/src/generated/resources/data/theurgy/recipes/distillation/cobblestone.json new file mode 100644 index 000000000..9698f80dd --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/cobblestone.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:cobblestone" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "forge:cobblestone" + }, + "ingredient_count": 10, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/cod.json b/src/generated/resources/data/theurgy/recipes/distillation/cod.json new file mode 100644 index 000000000..8b7bba54d --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/cod.json @@ -0,0 +1,12 @@ +{ + "type": "theurgy:distillation", + "distillation_time": 200, + "ingredient": { + "item": "minecraft:cod" + }, + "ingredient_count": 2, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/cooked_beef.json b/src/generated/resources/data/theurgy/recipes/distillation/cooked_beef.json new file mode 100644 index 000000000..ab6a10c61 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/cooked_beef.json @@ -0,0 +1,12 @@ +{ + "type": "theurgy:distillation", + "distillation_time": 200, + "ingredient": { + "item": "minecraft:cooked_beef" + }, + "ingredient_count": 1, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/cooked_chicken.json b/src/generated/resources/data/theurgy/recipes/distillation/cooked_chicken.json new file mode 100644 index 000000000..55312f187 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/cooked_chicken.json @@ -0,0 +1,12 @@ +{ + "type": "theurgy:distillation", + "distillation_time": 200, + "ingredient": { + "item": "minecraft:cooked_chicken" + }, + "ingredient_count": 1, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/cooked_cod.json b/src/generated/resources/data/theurgy/recipes/distillation/cooked_cod.json new file mode 100644 index 000000000..d138d04e8 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/cooked_cod.json @@ -0,0 +1,12 @@ +{ + "type": "theurgy:distillation", + "distillation_time": 200, + "ingredient": { + "item": "minecraft:cooked_cod" + }, + "ingredient_count": 1, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/cooked_porkchop.json b/src/generated/resources/data/theurgy/recipes/distillation/cooked_porkchop.json new file mode 100644 index 000000000..ec8d590c8 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/cooked_porkchop.json @@ -0,0 +1,12 @@ +{ + "type": "theurgy:distillation", + "distillation_time": 200, + "ingredient": { + "item": "minecraft:cooked_porkchop" + }, + "ingredient_count": 1, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/cooked_rabbit.json b/src/generated/resources/data/theurgy/recipes/distillation/cooked_rabbit.json new file mode 100644 index 000000000..d68b37a36 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/cooked_rabbit.json @@ -0,0 +1,12 @@ +{ + "type": "theurgy:distillation", + "distillation_time": 200, + "ingredient": { + "item": "minecraft:cooked_rabbit" + }, + "ingredient_count": 1, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/cooked_salmon.json b/src/generated/resources/data/theurgy/recipes/distillation/cooked_salmon.json new file mode 100644 index 000000000..41dadb542 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/cooked_salmon.json @@ -0,0 +1,12 @@ +{ + "type": "theurgy:distillation", + "distillation_time": 200, + "ingredient": { + "item": "minecraft:cooked_salmon" + }, + "ingredient_count": 1, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/crops.json b/src/generated/resources/data/theurgy/recipes/distillation/crops.json new file mode 100644 index 000000000..35b0dd7b6 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/crops.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:crops" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "forge:crops" + }, + "ingredient_count": 3, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/dirt.json b/src/generated/resources/data/theurgy/recipes/distillation/dirt.json new file mode 100644 index 000000000..4f8681b7d --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/dirt.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "minecraft:dirt" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "minecraft:dirt" + }, + "ingredient_count": 25, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/dyes.json b/src/generated/resources/data/theurgy/recipes/distillation/dyes.json new file mode 100644 index 000000000..6243bdba7 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/dyes.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:dyes" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "forge:dyes" + }, + "ingredient_count": 3, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/flowers.json b/src/generated/resources/data/theurgy/recipes/distillation/flowers.json new file mode 100644 index 000000000..4f2b615b3 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/flowers.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "minecraft:flowers" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "minecraft:flowers" + }, + "ingredient_count": 3, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/gems.mercury.high.json b/src/generated/resources/data/theurgy/recipes/distillation/gems.mercury.high.json new file mode 100644 index 000000000..73bd9ded9 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/gems.mercury.high.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "theurgy:gems/mercury/high" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "theurgy:gems/mercury/high" + }, + "ingredient_count": 1, + "result": { + "count": 10, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/gems.mercury.low.json b/src/generated/resources/data/theurgy/recipes/distillation/gems.mercury.low.json new file mode 100644 index 000000000..aba42dca5 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/gems.mercury.low.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "theurgy:gems/mercury/low" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "theurgy:gems/mercury/low" + }, + "ingredient_count": 1, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/gems.mercury.medium.json b/src/generated/resources/data/theurgy/recipes/distillation/gems.mercury.medium.json new file mode 100644 index 000000000..873c5f961 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/gems.mercury.medium.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "theurgy:gems/mercury/medium" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "theurgy:gems/mercury/medium" + }, + "ingredient_count": 1, + "result": { + "count": 5, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/glass.json b/src/generated/resources/data/theurgy/recipes/distillation/glass.json new file mode 100644 index 000000000..db262bd8d --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/glass.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:glass" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "forge:glass" + }, + "ingredient_count": 10, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/gravel.json b/src/generated/resources/data/theurgy/recipes/distillation/gravel.json new file mode 100644 index 000000000..35ce347e1 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/gravel.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:gravel" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "forge:gravel" + }, + "ingredient_count": 15, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/leaves.json b/src/generated/resources/data/theurgy/recipes/distillation/leaves.json new file mode 100644 index 000000000..c177f2002 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/leaves.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "minecraft:leaves" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "minecraft:leaves" + }, + "ingredient_count": 5, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/logs.json b/src/generated/resources/data/theurgy/recipes/distillation/logs.json new file mode 100644 index 000000000..d2b461630 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/logs.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "minecraft:logs" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "minecraft:logs" + }, + "ingredient_count": 2, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/metals.mercury.high.json b/src/generated/resources/data/theurgy/recipes/distillation/metals.mercury.high.json new file mode 100644 index 000000000..0b531963f --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/metals.mercury.high.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "theurgy:metals/mercury/high" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "theurgy:metals/mercury/high" + }, + "ingredient_count": 1, + "result": { + "count": 10, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/metals.mercury.low.json b/src/generated/resources/data/theurgy/recipes/distillation/metals.mercury.low.json new file mode 100644 index 000000000..bee94d055 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/metals.mercury.low.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "theurgy:metals/mercury/low" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "theurgy:metals/mercury/low" + }, + "ingredient_count": 1, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/metals.mercury.medium.json b/src/generated/resources/data/theurgy/recipes/distillation/metals.mercury.medium.json new file mode 100644 index 000000000..a3bc37c4b --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/metals.mercury.medium.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "theurgy:metals/mercury/medium" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "theurgy:metals/mercury/medium" + }, + "ingredient_count": 1, + "result": { + "count": 5, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/ores.mercury.high.json b/src/generated/resources/data/theurgy/recipes/distillation/ores.mercury.high.json new file mode 100644 index 000000000..4a3970e69 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/ores.mercury.high.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "theurgy:ores/mercury/high" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "theurgy:ores/mercury/high" + }, + "ingredient_count": 1, + "result": { + "count": 50, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/ores.mercury.low.json b/src/generated/resources/data/theurgy/recipes/distillation/ores.mercury.low.json new file mode 100644 index 000000000..1ac3e1026 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/ores.mercury.low.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "theurgy:ores/mercury/low" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "theurgy:ores/mercury/low" + }, + "ingredient_count": 1, + "result": { + "count": 5, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/ores.mercury.medium.json b/src/generated/resources/data/theurgy/recipes/distillation/ores.mercury.medium.json new file mode 100644 index 000000000..47ace9e23 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/ores.mercury.medium.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "theurgy:ores/mercury/medium" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "theurgy:ores/mercury/medium" + }, + "ingredient_count": 1, + "result": { + "count": 25, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/other_minerals.mercury.high.json b/src/generated/resources/data/theurgy/recipes/distillation/other_minerals.mercury.high.json new file mode 100644 index 000000000..99a94f7cf --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/other_minerals.mercury.high.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "theurgy:other_minerals/mercury/high" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "theurgy:other_minerals/mercury/high" + }, + "ingredient_count": 1, + "result": { + "count": 10, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/other_minerals.mercury.low.json b/src/generated/resources/data/theurgy/recipes/distillation/other_minerals.mercury.low.json new file mode 100644 index 000000000..c1b5d733a --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/other_minerals.mercury.low.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "theurgy:other_minerals/mercury/low" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "theurgy:other_minerals/mercury/low" + }, + "ingredient_count": 1, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/other_minerals.mercury.medium.json b/src/generated/resources/data/theurgy/recipes/distillation/other_minerals.mercury.medium.json new file mode 100644 index 000000000..cda18640c --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/other_minerals.mercury.medium.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "theurgy:other_minerals/mercury/medium" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "theurgy:other_minerals/mercury/medium" + }, + "ingredient_count": 1, + "result": { + "count": 5, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/planks.json b/src/generated/resources/data/theurgy/recipes/distillation/planks.json new file mode 100644 index 000000000..f22be5fb8 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/planks.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "minecraft:planks" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "minecraft:planks" + }, + "ingredient_count": 8, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/porkchop.json b/src/generated/resources/data/theurgy/recipes/distillation/porkchop.json new file mode 100644 index 000000000..9f7829837 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/porkchop.json @@ -0,0 +1,12 @@ +{ + "type": "theurgy:distillation", + "distillation_time": 200, + "ingredient": { + "item": "minecraft:porkchop" + }, + "ingredient_count": 2, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/rabbit.json b/src/generated/resources/data/theurgy/recipes/distillation/rabbit.json new file mode 100644 index 000000000..52b52218d --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/rabbit.json @@ -0,0 +1,12 @@ +{ + "type": "theurgy:distillation", + "distillation_time": 200, + "ingredient": { + "item": "minecraft:rabbit" + }, + "ingredient_count": 2, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/raw_materials.mercury.high.json b/src/generated/resources/data/theurgy/recipes/distillation/raw_materials.mercury.high.json new file mode 100644 index 000000000..9d0e2ab34 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/raw_materials.mercury.high.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "theurgy:raw_materials/mercury/high" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "theurgy:raw_materials/mercury/high" + }, + "ingredient_count": 1, + "result": { + "count": 10, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/raw_materials.mercury.low.json b/src/generated/resources/data/theurgy/recipes/distillation/raw_materials.mercury.low.json new file mode 100644 index 000000000..6c0ff001c --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/raw_materials.mercury.low.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "theurgy:raw_materials/mercury/low" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "theurgy:raw_materials/mercury/low" + }, + "ingredient_count": 1, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/raw_materials.mercury.medium.json b/src/generated/resources/data/theurgy/recipes/distillation/raw_materials.mercury.medium.json new file mode 100644 index 000000000..effa66624 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/raw_materials.mercury.medium.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "theurgy:raw_materials/mercury/medium" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "theurgy:raw_materials/mercury/medium" + }, + "ingredient_count": 1, + "result": { + "count": 5, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/salmon.json b/src/generated/resources/data/theurgy/recipes/distillation/salmon.json new file mode 100644 index 000000000..1a0b16783 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/salmon.json @@ -0,0 +1,12 @@ +{ + "type": "theurgy:distillation", + "distillation_time": 200, + "ingredient": { + "item": "minecraft:salmon" + }, + "ingredient_count": 2, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/sand.json b/src/generated/resources/data/theurgy/recipes/distillation/sand.json new file mode 100644 index 000000000..f64fa43f5 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/sand.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:sand" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "forge:sand" + }, + "ingredient_count": 15, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/sandstone.json b/src/generated/resources/data/theurgy/recipes/distillation/sandstone.json new file mode 100644 index 000000000..546e70f35 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/sandstone.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:sandstone" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "forge:sandstone" + }, + "ingredient_count": 10, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/saplings.json b/src/generated/resources/data/theurgy/recipes/distillation/saplings.json new file mode 100644 index 000000000..9c39d6a6d --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/saplings.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "minecraft:saplings" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "minecraft:saplings" + }, + "ingredient_count": 3, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/stone.json b/src/generated/resources/data/theurgy/recipes/distillation/stone.json new file mode 100644 index 000000000..2fb4ea527 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/stone.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:stone" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "forge:stone" + }, + "ingredient_count": 10, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/stone_bricks.json b/src/generated/resources/data/theurgy/recipes/distillation/stone_bricks.json new file mode 100644 index 000000000..98f112cd1 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/stone_bricks.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "minecraft:stone_bricks" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "minecraft:stone_bricks" + }, + "ingredient_count": 10, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/distillation/wool.json b/src/generated/resources/data/theurgy/recipes/distillation/wool.json new file mode 100644 index 000000000..6fbac4c2f --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/distillation/wool.json @@ -0,0 +1,21 @@ +{ + "type": "theurgy:distillation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "minecraft:wool" + } + } + ], + "distillation_time": 200, + "ingredient": { + "tag": "minecraft:wool" + }, + "ingredient_count": 1, + "result": { + "count": 1, + "item": "theurgy:mercury_shard" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/coals_from_alchemical_sulfur_coal.json b/src/generated/resources/data/theurgy/recipes/incubation/coals_from_alchemical_sulfur_coal.json new file mode 100644 index 000000000..041516e37 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/coals_from_alchemical_sulfur_coal.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "minecraft:coals" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "minecraft:coals" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_coal" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/dusts_redstone_from_alchemical_sulfur_redstone.json b/src/generated/resources/data/theurgy/recipes/incubation/dusts_redstone_from_alchemical_sulfur_redstone.json new file mode 100644 index 000000000..c325ef736 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/dusts_redstone_from_alchemical_sulfur_redstone.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:dusts/redstone" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:dusts/redstone" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_redstone" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/gems_amethyst_from_alchemical_sulfur_amethyst.json b/src/generated/resources/data/theurgy/recipes/incubation/gems_amethyst_from_alchemical_sulfur_amethyst.json new file mode 100644 index 000000000..ebf505f67 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/gems_amethyst_from_alchemical_sulfur_amethyst.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:gems/amethyst" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:gems/amethyst" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_amethyst" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/gems_apatite_from_alchemical_sulfur_apatite.json b/src/generated/resources/data/theurgy/recipes/incubation/gems_apatite_from_alchemical_sulfur_apatite.json new file mode 100644 index 000000000..9b753944c --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/gems_apatite_from_alchemical_sulfur_apatite.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:gems/apatite" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:gems/apatite" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_apatite" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/gems_diamond_from_alchemical_sulfur_diamond.json b/src/generated/resources/data/theurgy/recipes/incubation/gems_diamond_from_alchemical_sulfur_diamond.json new file mode 100644 index 000000000..36cef2e33 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/gems_diamond_from_alchemical_sulfur_diamond.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:gems/diamond" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:gems/diamond" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_diamond" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/gems_emerald_from_alchemical_sulfur_emerald.json b/src/generated/resources/data/theurgy/recipes/incubation/gems_emerald_from_alchemical_sulfur_emerald.json new file mode 100644 index 000000000..85ee0b5fe --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/gems_emerald_from_alchemical_sulfur_emerald.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:gems/emerald" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:gems/emerald" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_emerald" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/gems_fluorite_from_alchemical_sulfur_fluorite.json b/src/generated/resources/data/theurgy/recipes/incubation/gems_fluorite_from_alchemical_sulfur_fluorite.json new file mode 100644 index 000000000..24eba3f20 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/gems_fluorite_from_alchemical_sulfur_fluorite.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:gems/fluorite" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:gems/fluorite" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_fluorite" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/gems_lapis_from_alchemical_sulfur_lapis.json b/src/generated/resources/data/theurgy/recipes/incubation/gems_lapis_from_alchemical_sulfur_lapis.json new file mode 100644 index 000000000..0a94b7701 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/gems_lapis_from_alchemical_sulfur_lapis.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:gems/lapis" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:gems/lapis" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_lapis" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/gems_peridot_from_alchemical_sulfur_peridot.json b/src/generated/resources/data/theurgy/recipes/incubation/gems_peridot_from_alchemical_sulfur_peridot.json new file mode 100644 index 000000000..c8b9c7d41 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/gems_peridot_from_alchemical_sulfur_peridot.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:gems/peridot" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:gems/peridot" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_peridot" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/gems_prismarine_from_alchemical_sulfur_prismarine.json b/src/generated/resources/data/theurgy/recipes/incubation/gems_prismarine_from_alchemical_sulfur_prismarine.json new file mode 100644 index 000000000..616c14a64 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/gems_prismarine_from_alchemical_sulfur_prismarine.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:gems/prismarine" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:gems/prismarine" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_prismarine" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/gems_quartz_from_alchemical_sulfur_quartz.json b/src/generated/resources/data/theurgy/recipes/incubation/gems_quartz_from_alchemical_sulfur_quartz.json new file mode 100644 index 000000000..8f39a3737 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/gems_quartz_from_alchemical_sulfur_quartz.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:gems/quartz" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:gems/quartz" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_quartz" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/gems_ruby_from_alchemical_sulfur_ruby.json b/src/generated/resources/data/theurgy/recipes/incubation/gems_ruby_from_alchemical_sulfur_ruby.json new file mode 100644 index 000000000..d14261776 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/gems_ruby_from_alchemical_sulfur_ruby.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:gems/ruby" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:gems/ruby" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_ruby" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/gems_sal_ammoniac_from_alchemical_sulfur_sal_ammoniac.json b/src/generated/resources/data/theurgy/recipes/incubation/gems_sal_ammoniac_from_alchemical_sulfur_sal_ammoniac.json new file mode 100644 index 000000000..c6ccd7c87 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/gems_sal_ammoniac_from_alchemical_sulfur_sal_ammoniac.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:gems/sal_ammoniac" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:gems/sal_ammoniac" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/gems_sapphire_from_alchemical_sulfur_sapphire.json b/src/generated/resources/data/theurgy/recipes/incubation/gems_sapphire_from_alchemical_sulfur_sapphire.json new file mode 100644 index 000000000..cd136ef8d --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/gems_sapphire_from_alchemical_sulfur_sapphire.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:gems/sapphire" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:gems/sapphire" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_sapphire" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/gems_sulfur_from_alchemical_sulfur_sulfur.json b/src/generated/resources/data/theurgy/recipes/incubation/gems_sulfur_from_alchemical_sulfur_sulfur.json new file mode 100644 index 000000000..32d147352 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/gems_sulfur_from_alchemical_sulfur_sulfur.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:gems/sulfur" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:gems/sulfur" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_sulfur" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_allthemodium_from_alchemical_sulfur_allthemodium.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_allthemodium_from_alchemical_sulfur_allthemodium.json new file mode 100644 index 000000000..734796867 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_allthemodium_from_alchemical_sulfur_allthemodium.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/allthemodium" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:ingots/allthemodium" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_allthemodium" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_azure_silver_from_alchemical_sulfur_azure_silver.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_azure_silver_from_alchemical_sulfur_azure_silver.json new file mode 100644 index 000000000..2a1938f99 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_azure_silver_from_alchemical_sulfur_azure_silver.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/azure_silver" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:ingots/azure_silver" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_azure_silver" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_cinnabar_from_alchemical_sulfur_cinnabar.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_cinnabar_from_alchemical_sulfur_cinnabar.json new file mode 100644 index 000000000..f3f6e7fa3 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_cinnabar_from_alchemical_sulfur_cinnabar.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/cinnabar" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:ingots/cinnabar" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_cinnabar" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_copper_from_alchemical_sulfur_copper.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_copper_from_alchemical_sulfur_copper.json new file mode 100644 index 000000000..93b665e2d --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_copper_from_alchemical_sulfur_copper.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/copper" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:ingots/copper" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_copper" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_crimson_iron_from_alchemical_sulfur_crimson_iron.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_crimson_iron_from_alchemical_sulfur_crimson_iron.json new file mode 100644 index 000000000..bf68092e8 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_crimson_iron_from_alchemical_sulfur_crimson_iron.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/crimson_iron" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:ingots/crimson_iron" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_crimson_iron" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_gold_from_alchemical_sulfur_gold.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_gold_from_alchemical_sulfur_gold.json new file mode 100644 index 000000000..9c00bb9ad --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_gold_from_alchemical_sulfur_gold.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/gold" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:ingots/gold" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_gold" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_iridium_from_alchemical_sulfur_iridium.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_iridium_from_alchemical_sulfur_iridium.json new file mode 100644 index 000000000..8f50e575c --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_iridium_from_alchemical_sulfur_iridium.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/iridium" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:ingots/iridium" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_iridium" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_iron_from_alchemical_sulfur_iron.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_iron_from_alchemical_sulfur_iron.json new file mode 100644 index 000000000..a166ddfb9 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_iron_from_alchemical_sulfur_iron.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/iron" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:ingots/iron" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_iron" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_lead_from_alchemical_sulfur_lead.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_lead_from_alchemical_sulfur_lead.json new file mode 100644 index 000000000..f1dd7b1b3 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_lead_from_alchemical_sulfur_lead.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/lead" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:ingots/lead" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_lead" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_netherite_from_alchemical_sulfur_netherite.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_netherite_from_alchemical_sulfur_netherite.json new file mode 100644 index 000000000..b895e2a6d --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_netherite_from_alchemical_sulfur_netherite.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/netherite" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:ingots/netherite" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_netherite" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_nickel_from_alchemical_sulfur_nickel.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_nickel_from_alchemical_sulfur_nickel.json new file mode 100644 index 000000000..c83a599f7 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_nickel_from_alchemical_sulfur_nickel.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/nickel" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:ingots/nickel" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_nickel" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_osmium_from_alchemical_sulfur_osmium.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_osmium_from_alchemical_sulfur_osmium.json new file mode 100644 index 000000000..71808fba3 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_osmium_from_alchemical_sulfur_osmium.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/osmium" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:ingots/osmium" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_osmium" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_platinum_from_alchemical_sulfur_platinum.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_platinum_from_alchemical_sulfur_platinum.json new file mode 100644 index 000000000..fdbd0a7d6 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_platinum_from_alchemical_sulfur_platinum.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/platinum" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:ingots/platinum" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_platinum" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_silver_from_alchemical_sulfur_silver.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_silver_from_alchemical_sulfur_silver.json new file mode 100644 index 000000000..51b6fb8e2 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_silver_from_alchemical_sulfur_silver.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/silver" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:ingots/silver" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_silver" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_tin_from_alchemical_sulfur_tin.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_tin_from_alchemical_sulfur_tin.json new file mode 100644 index 000000000..28cc78e77 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_tin_from_alchemical_sulfur_tin.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/tin" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:ingots/tin" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_tin" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_unobtainium_from_alchemical_sulfur_unobtainium.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_unobtainium_from_alchemical_sulfur_unobtainium.json new file mode 100644 index 000000000..406cba354 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_unobtainium_from_alchemical_sulfur_unobtainium.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/unobtainium" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:ingots/unobtainium" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_unobtainium" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_uranium_from_alchemical_sulfur_uranium.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_uranium_from_alchemical_sulfur_uranium.json new file mode 100644 index 000000000..aaf8278ae --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_uranium_from_alchemical_sulfur_uranium.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/uranium" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:ingots/uranium" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_uranium" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_vibranium_from_alchemical_sulfur_vibranium.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_vibranium_from_alchemical_sulfur_vibranium.json new file mode 100644 index 000000000..d3ec62216 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_vibranium_from_alchemical_sulfur_vibranium.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/vibranium" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:ingots/vibranium" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_vibranium" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/ingots_zinc_from_alchemical_sulfur_zinc.json b/src/generated/resources/data/theurgy/recipes/incubation/ingots_zinc_from_alchemical_sulfur_zinc.json new file mode 100644 index 000000000..9390a7fd3 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/ingots_zinc_from_alchemical_sulfur_zinc.json @@ -0,0 +1,26 @@ +{ + "type": "theurgy:incubation", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/zinc" + } + } + ], + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "tag": "forge:ingots/zinc" + }, + "salt": { + "item": "theurgy:alchemical_salt_mineral" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_zinc" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/incubation/wheat.json b/src/generated/resources/data/theurgy/recipes/incubation/wheat.json new file mode 100644 index 000000000..e45d78f3a --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/incubation/wheat.json @@ -0,0 +1,17 @@ +{ + "type": "theurgy:incubation", + "incubation_time": 200, + "mercury": { + "item": "theurgy:mercury_shard" + }, + "result": { + "count": 1, + "item": "minecraft:wheat" + }, + "salt": { + "item": "theurgy:alchemical_salt_crops" + }, + "sulfur": { + "item": "theurgy:alchemical_sulfur_wheat" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_ingots_allthemodium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_ingots_allthemodium.json new file mode 100644 index 000000000..bc21f5eca --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_ingots_allthemodium.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/allthemodium" + } + } + ], + "ingredient": { + "tag": "forge:ingots/allthemodium" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_allthemodium", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ingots/allthemodium" + } + }, + "solvent": { + "amount": 100, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_ores_allthemodium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_ores_allthemodium.json new file mode 100644 index 000000000..1826395e6 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_ores_allthemodium.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/allthemodium" + } + } + ], + "ingredient": { + "tag": "forge:ores/allthemodium" + }, + "liquefaction_time": 200, + "result": { + "count": 3, + "item": "theurgy:alchemical_sulfur_allthemodium", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/allthemodium" + } + }, + "solvent": { + "amount": 100, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_raw_materials_allthemodium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_raw_materials_allthemodium.json new file mode 100644 index 000000000..1f42e368b --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_allthemodium_from_raw_materials_allthemodium.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:raw_materials/allthemodium" + } + } + ], + "ingredient": { + "tag": "forge:raw_materials/allthemodium" + }, + "liquefaction_time": 200, + "result": { + "count": 2, + "item": "theurgy:alchemical_sulfur_allthemodium", + "nbt": { + "theurgy:sulfur.source.id": "#forge:raw_materials/allthemodium" + } + }, + "solvent": { + "amount": 100, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_amethyst_from_gems_amethyst.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_amethyst_from_gems_amethyst.json new file mode 100644 index 000000000..2cb739ed7 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_amethyst_from_gems_amethyst.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:gems/amethyst" + } + } + ], + "ingredient": { + "tag": "forge:gems/amethyst" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_amethyst", + "nbt": { + "theurgy:sulfur.source.id": "#forge:gems/amethyst" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_apatite_from_gems_apatite.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_apatite_from_gems_apatite.json new file mode 100644 index 000000000..1c451a904 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_apatite_from_gems_apatite.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:gems/apatite" + } + } + ], + "ingredient": { + "tag": "forge:gems/apatite" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_apatite", + "nbt": { + "theurgy:sulfur.source.id": "#forge:gems/apatite" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_apatite_from_ores_apatite.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_apatite_from_ores_apatite.json new file mode 100644 index 000000000..6a7b15646 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_apatite_from_ores_apatite.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/apatite" + } + } + ], + "ingredient": { + "tag": "forge:ores/apatite" + }, + "liquefaction_time": 200, + "result": { + "count": 8, + "item": "theurgy:alchemical_sulfur_apatite", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/apatite" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_ingots_azure_silver.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_ingots_azure_silver.json new file mode 100644 index 000000000..36d461e15 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_ingots_azure_silver.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/azure_silver" + } + } + ], + "ingredient": { + "tag": "forge:ingots/azure_silver" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_azure_silver", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ingots/azure_silver" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_ores_azure_silver.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_ores_azure_silver.json new file mode 100644 index 000000000..35a0bfe4c --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_ores_azure_silver.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/azure_silver" + } + } + ], + "ingredient": { + "tag": "forge:ores/azure_silver" + }, + "liquefaction_time": 200, + "result": { + "count": 3, + "item": "theurgy:alchemical_sulfur_azure_silver", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/azure_silver" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_raw_materials_azure_silver.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_raw_materials_azure_silver.json new file mode 100644 index 000000000..e7427721e --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_azure_silver_from_raw_materials_azure_silver.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:raw_materials/azure_silver" + } + } + ], + "ingredient": { + "tag": "forge:raw_materials/azure_silver" + }, + "liquefaction_time": 200, + "result": { + "count": 2, + "item": "theurgy:alchemical_sulfur_azure_silver", + "nbt": { + "theurgy:sulfur.source.id": "#forge:raw_materials/azure_silver" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_ingots_cinnabar.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_ingots_cinnabar.json new file mode 100644 index 000000000..20ead4aa9 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_ingots_cinnabar.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/cinnabar" + } + } + ], + "ingredient": { + "tag": "forge:ingots/cinnabar" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_cinnabar", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ingots/cinnabar" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_ores_cinnabar.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_ores_cinnabar.json new file mode 100644 index 000000000..a63572840 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_ores_cinnabar.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/cinnabar" + } + } + ], + "ingredient": { + "tag": "forge:ores/cinnabar" + }, + "liquefaction_time": 200, + "result": { + "count": 3, + "item": "theurgy:alchemical_sulfur_cinnabar", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/cinnabar" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_raw_materials_cinnabar.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_raw_materials_cinnabar.json new file mode 100644 index 000000000..52d22c4fc --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_cinnabar_from_raw_materials_cinnabar.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:raw_materials/cinnabar" + } + } + ], + "ingredient": { + "tag": "forge:raw_materials/cinnabar" + }, + "liquefaction_time": 200, + "result": { + "count": 2, + "item": "theurgy:alchemical_sulfur_cinnabar", + "nbt": { + "theurgy:sulfur.source.id": "#forge:raw_materials/cinnabar" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_coal_from_coals.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_coal_from_coals.json new file mode 100644 index 000000000..7b7efc24d --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_coal_from_coals.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "minecraft:coals" + } + } + ], + "ingredient": { + "tag": "minecraft:coals" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_coal", + "nbt": { + "theurgy:sulfur.source.id": "#minecraft:coals" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_coal_from_ores_coal.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_coal_from_ores_coal.json new file mode 100644 index 000000000..96cf717b4 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_coal_from_ores_coal.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/coal" + } + } + ], + "ingredient": { + "tag": "forge:ores/coal" + }, + "liquefaction_time": 200, + "result": { + "count": 4, + "item": "theurgy:alchemical_sulfur_coal", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/coal" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_ingots_copper.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_ingots_copper.json new file mode 100644 index 000000000..464487b0a --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_ingots_copper.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/copper" + } + } + ], + "ingredient": { + "tag": "forge:ingots/copper" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_copper", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ingots/copper" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_ores_copper.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_ores_copper.json new file mode 100644 index 000000000..6bda1c026 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_ores_copper.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/copper" + } + } + ], + "ingredient": { + "tag": "forge:ores/copper" + }, + "liquefaction_time": 200, + "result": { + "count": 3, + "item": "theurgy:alchemical_sulfur_copper", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/copper" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_raw_materials_copper.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_raw_materials_copper.json new file mode 100644 index 000000000..1ac64ad2f --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_copper_from_raw_materials_copper.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:raw_materials/copper" + } + } + ], + "ingredient": { + "tag": "forge:raw_materials/copper" + }, + "liquefaction_time": 200, + "result": { + "count": 2, + "item": "theurgy:alchemical_sulfur_copper", + "nbt": { + "theurgy:sulfur.source.id": "#forge:raw_materials/copper" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_ingots_crimson_iron.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_ingots_crimson_iron.json new file mode 100644 index 000000000..50c09783d --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_ingots_crimson_iron.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/crimson_iron" + } + } + ], + "ingredient": { + "tag": "forge:ingots/crimson_iron" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_crimson_iron", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ingots/crimson_iron" + } + }, + "solvent": { + "amount": 20, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_ores_crimson_iron.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_ores_crimson_iron.json new file mode 100644 index 000000000..7d77cb42b --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_ores_crimson_iron.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/crimson_iron" + } + } + ], + "ingredient": { + "tag": "forge:ores/crimson_iron" + }, + "liquefaction_time": 200, + "result": { + "count": 3, + "item": "theurgy:alchemical_sulfur_crimson_iron", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/crimson_iron" + } + }, + "solvent": { + "amount": 20, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_raw_materials_crimson_iron.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_raw_materials_crimson_iron.json new file mode 100644 index 000000000..4ef670747 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_crimson_iron_from_raw_materials_crimson_iron.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:raw_materials/crimson_iron" + } + } + ], + "ingredient": { + "tag": "forge:raw_materials/crimson_iron" + }, + "liquefaction_time": 200, + "result": { + "count": 2, + "item": "theurgy:alchemical_sulfur_crimson_iron", + "nbt": { + "theurgy:sulfur.source.id": "#forge:raw_materials/crimson_iron" + } + }, + "solvent": { + "amount": 20, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_diamond_from_gems_diamond.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_diamond_from_gems_diamond.json new file mode 100644 index 000000000..0c95f5ce2 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_diamond_from_gems_diamond.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:gems/diamond" + } + } + ], + "ingredient": { + "tag": "forge:gems/diamond" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_diamond", + "nbt": { + "theurgy:sulfur.source.id": "#forge:gems/diamond" + } + }, + "solvent": { + "amount": 100, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_diamond_from_ores_diamond.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_diamond_from_ores_diamond.json new file mode 100644 index 000000000..92fb95b95 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_diamond_from_ores_diamond.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/diamond" + } + } + ], + "ingredient": { + "tag": "forge:ores/diamond" + }, + "liquefaction_time": 200, + "result": { + "count": 4, + "item": "theurgy:alchemical_sulfur_diamond", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/diamond" + } + }, + "solvent": { + "amount": 100, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_emerald_from_gems_emerald.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_emerald_from_gems_emerald.json new file mode 100644 index 000000000..76a424853 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_emerald_from_gems_emerald.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:gems/emerald" + } + } + ], + "ingredient": { + "tag": "forge:gems/emerald" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_emerald", + "nbt": { + "theurgy:sulfur.source.id": "#forge:gems/emerald" + } + }, + "solvent": { + "amount": 100, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_emerald_from_ores_emerald.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_emerald_from_ores_emerald.json new file mode 100644 index 000000000..1c15c00ac --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_emerald_from_ores_emerald.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/emerald" + } + } + ], + "ingredient": { + "tag": "forge:ores/emerald" + }, + "liquefaction_time": 200, + "result": { + "count": 4, + "item": "theurgy:alchemical_sulfur_emerald", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/emerald" + } + }, + "solvent": { + "amount": 100, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_fluorite_from_gems_fluorite.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_fluorite_from_gems_fluorite.json new file mode 100644 index 000000000..7696aeda2 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_fluorite_from_gems_fluorite.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:gems/fluorite" + } + } + ], + "ingredient": { + "tag": "forge:gems/fluorite" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_fluorite", + "nbt": { + "theurgy:sulfur.source.id": "#forge:gems/fluorite" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_fluorite_from_ores_fluorite.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_fluorite_from_ores_fluorite.json new file mode 100644 index 000000000..dc67017e3 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_fluorite_from_ores_fluorite.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/fluorite" + } + } + ], + "ingredient": { + "tag": "forge:ores/fluorite" + }, + "liquefaction_time": 200, + "result": { + "count": 6, + "item": "theurgy:alchemical_sulfur_fluorite", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/fluorite" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_ingots_gold.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_ingots_gold.json new file mode 100644 index 000000000..8ba3e4368 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_ingots_gold.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/gold" + } + } + ], + "ingredient": { + "tag": "forge:ingots/gold" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_gold", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ingots/gold" + } + }, + "solvent": { + "amount": 15, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_ores_gold.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_ores_gold.json new file mode 100644 index 000000000..df839cf39 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_ores_gold.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/gold" + } + } + ], + "ingredient": { + "tag": "forge:ores/gold" + }, + "liquefaction_time": 200, + "result": { + "count": 3, + "item": "theurgy:alchemical_sulfur_gold", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/gold" + } + }, + "solvent": { + "amount": 15, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_raw_materials_gold.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_raw_materials_gold.json new file mode 100644 index 000000000..ef2fc5dd9 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_gold_from_raw_materials_gold.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:raw_materials/gold" + } + } + ], + "ingredient": { + "tag": "forge:raw_materials/gold" + }, + "liquefaction_time": 200, + "result": { + "count": 2, + "item": "theurgy:alchemical_sulfur_gold", + "nbt": { + "theurgy:sulfur.source.id": "#forge:raw_materials/gold" + } + }, + "solvent": { + "amount": 15, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_ingots_iridium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_ingots_iridium.json new file mode 100644 index 000000000..2fc6b8315 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_ingots_iridium.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/iridium" + } + } + ], + "ingredient": { + "tag": "forge:ingots/iridium" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_iridium", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ingots/iridium" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_ores_iridium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_ores_iridium.json new file mode 100644 index 000000000..d25559f6d --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_ores_iridium.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/iridium" + } + } + ], + "ingredient": { + "tag": "forge:ores/iridium" + }, + "liquefaction_time": 200, + "result": { + "count": 3, + "item": "theurgy:alchemical_sulfur_iridium", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/iridium" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_raw_materials_iridium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_raw_materials_iridium.json new file mode 100644 index 000000000..1556ee69e --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iridium_from_raw_materials_iridium.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:raw_materials/iridium" + } + } + ], + "ingredient": { + "tag": "forge:raw_materials/iridium" + }, + "liquefaction_time": 200, + "result": { + "count": 2, + "item": "theurgy:alchemical_sulfur_iridium", + "nbt": { + "theurgy:sulfur.source.id": "#forge:raw_materials/iridium" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_ingots_iron.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_ingots_iron.json new file mode 100644 index 000000000..373764a03 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_ingots_iron.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/iron" + } + } + ], + "ingredient": { + "tag": "forge:ingots/iron" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_iron", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ingots/iron" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_ores_iron.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_ores_iron.json new file mode 100644 index 000000000..2faa83ee6 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_ores_iron.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/iron" + } + } + ], + "ingredient": { + "tag": "forge:ores/iron" + }, + "liquefaction_time": 200, + "result": { + "count": 3, + "item": "theurgy:alchemical_sulfur_iron", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/iron" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_raw_materials_iron.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_raw_materials_iron.json new file mode 100644 index 000000000..3f80adf0c --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_iron_from_raw_materials_iron.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:raw_materials/iron" + } + } + ], + "ingredient": { + "tag": "forge:raw_materials/iron" + }, + "liquefaction_time": 200, + "result": { + "count": 2, + "item": "theurgy:alchemical_sulfur_iron", + "nbt": { + "theurgy:sulfur.source.id": "#forge:raw_materials/iron" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lapis_from_gems_lapis.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lapis_from_gems_lapis.json new file mode 100644 index 000000000..b88d25bfc --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lapis_from_gems_lapis.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:gems/lapis" + } + } + ], + "ingredient": { + "tag": "forge:gems/lapis" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_lapis", + "nbt": { + "theurgy:sulfur.source.id": "#forge:gems/lapis" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lapis_from_ores_lapis.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lapis_from_ores_lapis.json new file mode 100644 index 000000000..8e89d4574 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lapis_from_ores_lapis.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/lapis" + } + } + ], + "ingredient": { + "tag": "forge:ores/lapis" + }, + "liquefaction_time": 200, + "result": { + "count": 10, + "item": "theurgy:alchemical_sulfur_lapis", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/lapis" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_ingots_lead.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_ingots_lead.json new file mode 100644 index 000000000..05fb818f1 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_ingots_lead.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/lead" + } + } + ], + "ingredient": { + "tag": "forge:ingots/lead" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_lead", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ingots/lead" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_ores_lead.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_ores_lead.json new file mode 100644 index 000000000..a9ee0edce --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_ores_lead.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/lead" + } + } + ], + "ingredient": { + "tag": "forge:ores/lead" + }, + "liquefaction_time": 200, + "result": { + "count": 3, + "item": "theurgy:alchemical_sulfur_lead", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/lead" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_raw_materials_lead.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_raw_materials_lead.json new file mode 100644 index 000000000..44faea285 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_lead_from_raw_materials_lead.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:raw_materials/lead" + } + } + ], + "ingredient": { + "tag": "forge:raw_materials/lead" + }, + "liquefaction_time": 200, + "result": { + "count": 2, + "item": "theurgy:alchemical_sulfur_lead", + "nbt": { + "theurgy:sulfur.source.id": "#forge:raw_materials/lead" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_logs_from_logs.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_logs_from_logs.json new file mode 100644 index 000000000..ffbaf001c --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_logs_from_logs.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "minecraft:logs" + } + } + ], + "ingredient": { + "tag": "minecraft:logs" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_logs", + "nbt": { + "theurgy:sulfur.source.id": "#minecraft:logs" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_netherite_from_ingots_netherite.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_netherite_from_ingots_netherite.json new file mode 100644 index 000000000..c64f07b3a --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_netherite_from_ingots_netherite.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/netherite" + } + } + ], + "ingredient": { + "tag": "forge:ingots/netherite" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_netherite", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ingots/netherite" + } + }, + "solvent": { + "amount": 100, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_netherite_from_ores_netherite_scrap.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_netherite_from_ores_netherite_scrap.json new file mode 100644 index 000000000..ed56e4e01 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_netherite_from_ores_netherite_scrap.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/netherite_scrap" + } + } + ], + "ingredient": { + "tag": "forge:ores/netherite_scrap" + }, + "liquefaction_time": 200, + "result": { + "count": 3, + "item": "theurgy:alchemical_sulfur_netherite", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/netherite_scrap" + } + }, + "solvent": { + "amount": 100, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_ingots_nickel.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_ingots_nickel.json new file mode 100644 index 000000000..d8a1b878d --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_ingots_nickel.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/nickel" + } + } + ], + "ingredient": { + "tag": "forge:ingots/nickel" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_nickel", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ingots/nickel" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_ores_nickel.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_ores_nickel.json new file mode 100644 index 000000000..597417795 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_ores_nickel.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/nickel" + } + } + ], + "ingredient": { + "tag": "forge:ores/nickel" + }, + "liquefaction_time": 200, + "result": { + "count": 3, + "item": "theurgy:alchemical_sulfur_nickel", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/nickel" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_raw_materials_nickel.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_raw_materials_nickel.json new file mode 100644 index 000000000..98827023a --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_nickel_from_raw_materials_nickel.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:raw_materials/nickel" + } + } + ], + "ingredient": { + "tag": "forge:raw_materials/nickel" + }, + "liquefaction_time": 200, + "result": { + "count": 2, + "item": "theurgy:alchemical_sulfur_nickel", + "nbt": { + "theurgy:sulfur.source.id": "#forge:raw_materials/nickel" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_ingots_osmium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_ingots_osmium.json new file mode 100644 index 000000000..2c8ce9a66 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_ingots_osmium.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/osmium" + } + } + ], + "ingredient": { + "tag": "forge:ingots/osmium" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_osmium", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ingots/osmium" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_ores_osmium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_ores_osmium.json new file mode 100644 index 000000000..d1c968b8e --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_ores_osmium.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/osmium" + } + } + ], + "ingredient": { + "tag": "forge:ores/osmium" + }, + "liquefaction_time": 200, + "result": { + "count": 3, + "item": "theurgy:alchemical_sulfur_osmium", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/osmium" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_raw_materials_osmium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_raw_materials_osmium.json new file mode 100644 index 000000000..c4856a2e9 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_osmium_from_raw_materials_osmium.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:raw_materials/osmium" + } + } + ], + "ingredient": { + "tag": "forge:raw_materials/osmium" + }, + "liquefaction_time": 200, + "result": { + "count": 2, + "item": "theurgy:alchemical_sulfur_osmium", + "nbt": { + "theurgy:sulfur.source.id": "#forge:raw_materials/osmium" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_peridot_from_gems_peridot.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_peridot_from_gems_peridot.json new file mode 100644 index 000000000..756ce726d --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_peridot_from_gems_peridot.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:gems/peridot" + } + } + ], + "ingredient": { + "tag": "forge:gems/peridot" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_peridot", + "nbt": { + "theurgy:sulfur.source.id": "#forge:gems/peridot" + } + }, + "solvent": { + "amount": 15, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_peridot_from_ores_peridot.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_peridot_from_ores_peridot.json new file mode 100644 index 000000000..65a01b3b4 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_peridot_from_ores_peridot.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/peridot" + } + } + ], + "ingredient": { + "tag": "forge:ores/peridot" + }, + "liquefaction_time": 200, + "result": { + "count": 6, + "item": "theurgy:alchemical_sulfur_peridot", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/peridot" + } + }, + "solvent": { + "amount": 15, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_ingots_platinum.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_ingots_platinum.json new file mode 100644 index 000000000..795b3555b --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_ingots_platinum.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/platinum" + } + } + ], + "ingredient": { + "tag": "forge:ingots/platinum" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_platinum", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ingots/platinum" + } + }, + "solvent": { + "amount": 20, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_ores_platinum.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_ores_platinum.json new file mode 100644 index 000000000..99a6b5fd5 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_ores_platinum.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/platinum" + } + } + ], + "ingredient": { + "tag": "forge:ores/platinum" + }, + "liquefaction_time": 200, + "result": { + "count": 3, + "item": "theurgy:alchemical_sulfur_platinum", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/platinum" + } + }, + "solvent": { + "amount": 20, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_raw_materials_platinum.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_raw_materials_platinum.json new file mode 100644 index 000000000..caf9767a6 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_platinum_from_raw_materials_platinum.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:raw_materials/platinum" + } + } + ], + "ingredient": { + "tag": "forge:raw_materials/platinum" + }, + "liquefaction_time": 200, + "result": { + "count": 2, + "item": "theurgy:alchemical_sulfur_platinum", + "nbt": { + "theurgy:sulfur.source.id": "#forge:raw_materials/platinum" + } + }, + "solvent": { + "amount": 20, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_prismarine_from_gems_prismarine.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_prismarine_from_gems_prismarine.json new file mode 100644 index 000000000..217c0fb14 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_prismarine_from_gems_prismarine.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:gems/prismarine" + } + } + ], + "ingredient": { + "tag": "forge:gems/prismarine" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_prismarine", + "nbt": { + "theurgy:sulfur.source.id": "#forge:gems/prismarine" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_quartz_from_gems_quartz.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_quartz_from_gems_quartz.json new file mode 100644 index 000000000..3d1fa2021 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_quartz_from_gems_quartz.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:gems/quartz" + } + } + ], + "ingredient": { + "tag": "forge:gems/quartz" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_quartz", + "nbt": { + "theurgy:sulfur.source.id": "#forge:gems/quartz" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_quartz_from_ores_quartz.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_quartz_from_ores_quartz.json new file mode 100644 index 000000000..c569cc7dd --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_quartz_from_ores_quartz.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/quartz" + } + } + ], + "ingredient": { + "tag": "forge:ores/quartz" + }, + "liquefaction_time": 200, + "result": { + "count": 8, + "item": "theurgy:alchemical_sulfur_quartz", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/quartz" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_redstone_from_dusts_redstone.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_redstone_from_dusts_redstone.json new file mode 100644 index 000000000..ad07bed72 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_redstone_from_dusts_redstone.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:dusts/redstone" + } + } + ], + "ingredient": { + "tag": "forge:dusts/redstone" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_redstone", + "nbt": { + "theurgy:sulfur.source.id": "#forge:dusts/redstone" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_redstone_from_ores_redstone.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_redstone_from_ores_redstone.json new file mode 100644 index 000000000..86768cad4 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_redstone_from_ores_redstone.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/redstone" + } + } + ], + "ingredient": { + "tag": "forge:ores/redstone" + }, + "liquefaction_time": 200, + "result": { + "count": 9, + "item": "theurgy:alchemical_sulfur_redstone", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/redstone" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_ruby_from_gems_ruby.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_ruby_from_gems_ruby.json new file mode 100644 index 000000000..6b5713152 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_ruby_from_gems_ruby.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:gems/ruby" + } + } + ], + "ingredient": { + "tag": "forge:gems/ruby" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_ruby", + "nbt": { + "theurgy:sulfur.source.id": "#forge:gems/ruby" + } + }, + "solvent": { + "amount": 15, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_ruby_from_ores_ruby.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_ruby_from_ores_ruby.json new file mode 100644 index 000000000..e3b606edc --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_ruby_from_ores_ruby.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/ruby" + } + } + ], + "ingredient": { + "tag": "forge:ores/ruby" + }, + "liquefaction_time": 200, + "result": { + "count": 6, + "item": "theurgy:alchemical_sulfur_ruby", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/ruby" + } + }, + "solvent": { + "amount": 15, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sal_ammoniac_from_gems_sal_ammoniac.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sal_ammoniac_from_gems_sal_ammoniac.json new file mode 100644 index 000000000..d3017a6a2 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sal_ammoniac_from_gems_sal_ammoniac.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:gems/sal_ammoniac" + } + } + ], + "ingredient": { + "tag": "forge:gems/sal_ammoniac" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_sal_ammoniac", + "nbt": { + "theurgy:sulfur.source.id": "#forge:gems/sal_ammoniac" + } + }, + "solvent": { + "amount": 15, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sal_ammoniac_from_ores_sal_ammoniac.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sal_ammoniac_from_ores_sal_ammoniac.json new file mode 100644 index 000000000..eff9260dc --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sal_ammoniac_from_ores_sal_ammoniac.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/sal_ammoniac" + } + } + ], + "ingredient": { + "tag": "forge:ores/sal_ammoniac" + }, + "liquefaction_time": 200, + "result": { + "count": 4, + "item": "theurgy:alchemical_sulfur_sal_ammoniac", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/sal_ammoniac" + } + }, + "solvent": { + "amount": 15, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sapphire_from_gems_sapphire.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sapphire_from_gems_sapphire.json new file mode 100644 index 000000000..5b65fabd5 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sapphire_from_gems_sapphire.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:gems/sapphire" + } + } + ], + "ingredient": { + "tag": "forge:gems/sapphire" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_sapphire", + "nbt": { + "theurgy:sulfur.source.id": "#forge:gems/sapphire" + } + }, + "solvent": { + "amount": 15, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sapphire_from_ores_sapphire.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sapphire_from_ores_sapphire.json new file mode 100644 index 000000000..867360d78 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sapphire_from_ores_sapphire.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/sapphire" + } + } + ], + "ingredient": { + "tag": "forge:ores/sapphire" + }, + "liquefaction_time": 200, + "result": { + "count": 6, + "item": "theurgy:alchemical_sulfur_sapphire", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/sapphire" + } + }, + "solvent": { + "amount": 15, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_ingots_silver.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_ingots_silver.json new file mode 100644 index 000000000..6564e4345 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_ingots_silver.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/silver" + } + } + ], + "ingredient": { + "tag": "forge:ingots/silver" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_silver", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ingots/silver" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_ores_silver.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_ores_silver.json new file mode 100644 index 000000000..0b19ec4ba --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_ores_silver.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/silver" + } + } + ], + "ingredient": { + "tag": "forge:ores/silver" + }, + "liquefaction_time": 200, + "result": { + "count": 3, + "item": "theurgy:alchemical_sulfur_silver", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/silver" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_raw_materials_silver.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_raw_materials_silver.json new file mode 100644 index 000000000..328632f5a --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_silver_from_raw_materials_silver.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:raw_materials/silver" + } + } + ], + "ingredient": { + "tag": "forge:raw_materials/silver" + }, + "liquefaction_time": 200, + "result": { + "count": 2, + "item": "theurgy:alchemical_sulfur_silver", + "nbt": { + "theurgy:sulfur.source.id": "#forge:raw_materials/silver" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sulfur_from_gems_sulfur.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sulfur_from_gems_sulfur.json new file mode 100644 index 000000000..e512e46e7 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sulfur_from_gems_sulfur.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:gems/sulfur" + } + } + ], + "ingredient": { + "tag": "forge:gems/sulfur" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_sulfur", + "nbt": { + "theurgy:sulfur.source.id": "#forge:gems/sulfur" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sulfur_from_ores_sulfur.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sulfur_from_ores_sulfur.json new file mode 100644 index 000000000..816b1a539 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_sulfur_from_ores_sulfur.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/sulfur" + } + } + ], + "ingredient": { + "tag": "forge:ores/sulfur" + }, + "liquefaction_time": 200, + "result": { + "count": 6, + "item": "theurgy:alchemical_sulfur_sulfur", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/sulfur" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_ingots_tin.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_ingots_tin.json new file mode 100644 index 000000000..64599a0fb --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_ingots_tin.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/tin" + } + } + ], + "ingredient": { + "tag": "forge:ingots/tin" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_tin", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ingots/tin" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_ores_tin.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_ores_tin.json new file mode 100644 index 000000000..adce5865f --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_ores_tin.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/tin" + } + } + ], + "ingredient": { + "tag": "forge:ores/tin" + }, + "liquefaction_time": 200, + "result": { + "count": 3, + "item": "theurgy:alchemical_sulfur_tin", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/tin" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_raw_materials_tin.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_raw_materials_tin.json new file mode 100644 index 000000000..33f1e45aa --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_tin_from_raw_materials_tin.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:raw_materials/tin" + } + } + ], + "ingredient": { + "tag": "forge:raw_materials/tin" + }, + "liquefaction_time": 200, + "result": { + "count": 2, + "item": "theurgy:alchemical_sulfur_tin", + "nbt": { + "theurgy:sulfur.source.id": "#forge:raw_materials/tin" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_ingots_unobtainium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_ingots_unobtainium.json new file mode 100644 index 000000000..1f3564ae1 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_ingots_unobtainium.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/unobtainium" + } + } + ], + "ingredient": { + "tag": "forge:ingots/unobtainium" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_unobtainium", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ingots/unobtainium" + } + }, + "solvent": { + "amount": 100, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_ores_unobtainium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_ores_unobtainium.json new file mode 100644 index 000000000..d191220f3 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_ores_unobtainium.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/unobtainium" + } + } + ], + "ingredient": { + "tag": "forge:ores/unobtainium" + }, + "liquefaction_time": 200, + "result": { + "count": 3, + "item": "theurgy:alchemical_sulfur_unobtainium", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/unobtainium" + } + }, + "solvent": { + "amount": 100, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_raw_materials_unobtainium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_raw_materials_unobtainium.json new file mode 100644 index 000000000..3c64f5e80 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_unobtainium_from_raw_materials_unobtainium.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:raw_materials/unobtainium" + } + } + ], + "ingredient": { + "tag": "forge:raw_materials/unobtainium" + }, + "liquefaction_time": 200, + "result": { + "count": 2, + "item": "theurgy:alchemical_sulfur_unobtainium", + "nbt": { + "theurgy:sulfur.source.id": "#forge:raw_materials/unobtainium" + } + }, + "solvent": { + "amount": 100, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_ingots_uranium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_ingots_uranium.json new file mode 100644 index 000000000..acba7b3b6 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_ingots_uranium.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/uranium" + } + } + ], + "ingredient": { + "tag": "forge:ingots/uranium" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_uranium", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ingots/uranium" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_ores_uranium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_ores_uranium.json new file mode 100644 index 000000000..6951478e0 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_ores_uranium.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/uranium" + } + } + ], + "ingredient": { + "tag": "forge:ores/uranium" + }, + "liquefaction_time": 200, + "result": { + "count": 3, + "item": "theurgy:alchemical_sulfur_uranium", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/uranium" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_raw_materials_uranium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_raw_materials_uranium.json new file mode 100644 index 000000000..211336894 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_uranium_from_raw_materials_uranium.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:raw_materials/uranium" + } + } + ], + "ingredient": { + "tag": "forge:raw_materials/uranium" + }, + "liquefaction_time": 200, + "result": { + "count": 2, + "item": "theurgy:alchemical_sulfur_uranium", + "nbt": { + "theurgy:sulfur.source.id": "#forge:raw_materials/uranium" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_ingots_vibranium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_ingots_vibranium.json new file mode 100644 index 000000000..e33893740 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_ingots_vibranium.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/vibranium" + } + } + ], + "ingredient": { + "tag": "forge:ingots/vibranium" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_vibranium", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ingots/vibranium" + } + }, + "solvent": { + "amount": 20, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_ores_vibranium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_ores_vibranium.json new file mode 100644 index 000000000..250ac574f --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_ores_vibranium.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/vibranium" + } + } + ], + "ingredient": { + "tag": "forge:ores/vibranium" + }, + "liquefaction_time": 200, + "result": { + "count": 3, + "item": "theurgy:alchemical_sulfur_vibranium", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/vibranium" + } + }, + "solvent": { + "amount": 20, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_raw_materials_vibranium.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_raw_materials_vibranium.json new file mode 100644 index 000000000..6ddaad502 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_vibranium_from_raw_materials_vibranium.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:raw_materials/vibranium" + } + } + ], + "ingredient": { + "tag": "forge:raw_materials/vibranium" + }, + "liquefaction_time": 200, + "result": { + "count": 2, + "item": "theurgy:alchemical_sulfur_vibranium", + "nbt": { + "theurgy:sulfur.source.id": "#forge:raw_materials/vibranium" + } + }, + "solvent": { + "amount": 20, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_wheat.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_wheat.json new file mode 100644 index 000000000..0d94b5459 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_wheat.json @@ -0,0 +1,18 @@ +{ + "type": "theurgy:liquefaction", + "ingredient": { + "item": "minecraft:wheat" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_wheat", + "nbt": { + "theurgy:sulfur.source.id": "minecraft:wheat" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_ingots_zinc.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_ingots_zinc.json new file mode 100644 index 000000000..64502ce1d --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_ingots_zinc.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ingots/zinc" + } + } + ], + "ingredient": { + "tag": "forge:ingots/zinc" + }, + "liquefaction_time": 200, + "result": { + "count": 1, + "item": "theurgy:alchemical_sulfur_zinc", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ingots/zinc" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_ores_zinc.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_ores_zinc.json new file mode 100644 index 000000000..1bfafffa2 --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_ores_zinc.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:ores/zinc" + } + } + ], + "ingredient": { + "tag": "forge:ores/zinc" + }, + "liquefaction_time": 200, + "result": { + "count": 3, + "item": "theurgy:alchemical_sulfur_zinc", + "nbt": { + "theurgy:sulfur.source.id": "#forge:ores/zinc" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_raw_materials_zinc.json b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_raw_materials_zinc.json new file mode 100644 index 000000000..d272c887a --- /dev/null +++ b/src/generated/resources/data/theurgy/recipes/liquefaction/alchemical_sulfur_zinc_from_raw_materials_zinc.json @@ -0,0 +1,27 @@ +{ + "type": "theurgy:liquefaction", + "conditions": [ + { + "type": "forge:not", + "value": { + "type": "forge:tag_empty", + "tag": "forge:raw_materials/zinc" + } + } + ], + "ingredient": { + "tag": "forge:raw_materials/zinc" + }, + "liquefaction_time": 200, + "result": { + "count": 2, + "item": "theurgy:alchemical_sulfur_zinc", + "nbt": { + "theurgy:sulfur.source.id": "#forge:raw_materials/zinc" + } + }, + "solvent": { + "amount": 10, + "fluid": "theurgy:sal_ammoniac" + } +} \ No newline at end of file diff --git a/src/main/resources/data/theurgy/tags/blocks/divination_rod_t1_allowed_blocks.json b/src/generated/resources/data/theurgy/tags/blocks/divination_rod_t1_allowed_blocks.json similarity index 53% rename from src/main/resources/data/theurgy/tags/blocks/divination_rod_t1_allowed_blocks.json rename to src/generated/resources/data/theurgy/tags/blocks/divination_rod_t1_allowed_blocks.json index c5405a5d4..cdab1e7da 100644 --- a/src/main/resources/data/theurgy/tags/blocks/divination_rod_t1_allowed_blocks.json +++ b/src/generated/resources/data/theurgy/tags/blocks/divination_rod_t1_allowed_blocks.json @@ -1,10 +1,9 @@ { - "replace": false, "values": [ + "minecraft:sugar_cane", "#forge:ores", "#forge:sand", "#forge:stone", - "#minecraft:logs", - "minecraft:sugar_cane" + "#minecraft:logs" ] } \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/blocks/divination_rod_t1_disallowed_blocks.json b/src/generated/resources/data/theurgy/tags/blocks/divination_rod_t1_disallowed_blocks.json new file mode 100644 index 000000000..f72d209df --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/blocks/divination_rod_t1_disallowed_blocks.json @@ -0,0 +1,3 @@ +{ + "values": [] +} \ No newline at end of file diff --git a/src/main/resources/data/theurgy/tags/blocks/divination_rod_t2_allowed_blocks.json b/src/generated/resources/data/theurgy/tags/blocks/divination_rod_t2_allowed_blocks.json similarity index 82% rename from src/main/resources/data/theurgy/tags/blocks/divination_rod_t2_allowed_blocks.json rename to src/generated/resources/data/theurgy/tags/blocks/divination_rod_t2_allowed_blocks.json index 64cf5f982..9339e6a5f 100644 --- a/src/main/resources/data/theurgy/tags/blocks/divination_rod_t2_allowed_blocks.json +++ b/src/generated/resources/data/theurgy/tags/blocks/divination_rod_t2_allowed_blocks.json @@ -1,5 +1,4 @@ { - "replace": false, "values": [ "#theurgy:divination_rod_t1_allowed_blocks", "#forge:obsidian" diff --git a/src/generated/resources/data/theurgy/tags/blocks/divination_rod_t2_disallowed_blocks.json b/src/generated/resources/data/theurgy/tags/blocks/divination_rod_t2_disallowed_blocks.json new file mode 100644 index 000000000..f72d209df --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/blocks/divination_rod_t2_disallowed_blocks.json @@ -0,0 +1,3 @@ +{ + "values": [] +} \ No newline at end of file diff --git a/src/main/resources/data/theurgy/tags/blocks/divination_rod_t3_allowed_blocks.json b/src/generated/resources/data/theurgy/tags/blocks/divination_rod_t3_allowed_blocks.json similarity index 77% rename from src/main/resources/data/theurgy/tags/blocks/divination_rod_t3_allowed_blocks.json rename to src/generated/resources/data/theurgy/tags/blocks/divination_rod_t3_allowed_blocks.json index 2093964d9..417f1267b 100644 --- a/src/main/resources/data/theurgy/tags/blocks/divination_rod_t3_allowed_blocks.json +++ b/src/generated/resources/data/theurgy/tags/blocks/divination_rod_t3_allowed_blocks.json @@ -1,5 +1,4 @@ { - "replace": false, "values": [ "#theurgy:divination_rod_t2_allowed_blocks" ] diff --git a/src/generated/resources/data/theurgy/tags/blocks/divination_rod_t3_disallowed_blocks.json b/src/generated/resources/data/theurgy/tags/blocks/divination_rod_t3_disallowed_blocks.json new file mode 100644 index 000000000..f72d209df --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/blocks/divination_rod_t3_disallowed_blocks.json @@ -0,0 +1,3 @@ +{ + "values": [] +} \ No newline at end of file diff --git a/src/main/resources/data/theurgy/tags/blocks/divination_rod_t4_allowed_blocks.json b/src/generated/resources/data/theurgy/tags/blocks/divination_rod_t4_allowed_blocks.json similarity index 77% rename from src/main/resources/data/theurgy/tags/blocks/divination_rod_t4_allowed_blocks.json rename to src/generated/resources/data/theurgy/tags/blocks/divination_rod_t4_allowed_blocks.json index b1af0aad4..fe8eed788 100644 --- a/src/main/resources/data/theurgy/tags/blocks/divination_rod_t4_allowed_blocks.json +++ b/src/generated/resources/data/theurgy/tags/blocks/divination_rod_t4_allowed_blocks.json @@ -1,5 +1,4 @@ { - "replace": false, "values": [ "#theurgy:divination_rod_t3_allowed_blocks" ] diff --git a/src/generated/resources/data/theurgy/tags/blocks/divination_rod_t4_disallowed_blocks.json b/src/generated/resources/data/theurgy/tags/blocks/divination_rod_t4_disallowed_blocks.json new file mode 100644 index 000000000..f72d209df --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/blocks/divination_rod_t4_disallowed_blocks.json @@ -0,0 +1,3 @@ +{ + "values": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/blocks/incubator_vessels.json b/src/generated/resources/data/theurgy/tags/blocks/incubator_vessels.json new file mode 100644 index 000000000..765a85a5e --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/blocks/incubator_vessels.json @@ -0,0 +1,7 @@ +{ + "values": [ + "theurgy:incubator_mercury_vessel", + "theurgy:incubator_salt_vessel", + "theurgy:incubator_sulfur_vessel" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/fluids/sal_ammoniac.json b/src/generated/resources/data/theurgy/tags/fluids/sal_ammoniac.json new file mode 100644 index 000000000..78c55b222 --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/fluids/sal_ammoniac.json @@ -0,0 +1,6 @@ +{ + "values": [ + "theurgy:sal_ammoniac", + "theurgy:sal_ammoniac_flowing" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/fluids/solvent.json b/src/generated/resources/data/theurgy/tags/fluids/solvent.json new file mode 100644 index 000000000..5902c2dfc --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/fluids/solvent.json @@ -0,0 +1,5 @@ +{ + "values": [ + "#theurgy:sal_ammoniac" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/alchemical_mercuries.json b/src/generated/resources/data/theurgy/tags/items/alchemical_mercuries.json new file mode 100644 index 000000000..a487ddf33 --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/alchemical_mercuries.json @@ -0,0 +1,6 @@ +{ + "values": [ + "theurgy:mercury_shard", + "theurgy:mercury_crystal" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/alchemical_salts.json b/src/generated/resources/data/theurgy/tags/items/alchemical_salts.json new file mode 100644 index 000000000..2aa57ebf3 --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/alchemical_salts.json @@ -0,0 +1,7 @@ +{ + "values": [ + "theurgy:alchemical_salt_strata", + "theurgy:alchemical_salt_mineral", + "theurgy:alchemical_salt_crops" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs.json b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs.json new file mode 100644 index 000000000..2f61f17d3 --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs.json @@ -0,0 +1,40 @@ +{ + "values": [ + "theurgy:alchemical_sulfur_logs", + "theurgy:alchemical_sulfur_wheat", + "theurgy:alchemical_sulfur_iron", + "theurgy:alchemical_sulfur_copper", + "theurgy:alchemical_sulfur_silver", + "theurgy:alchemical_sulfur_gold", + "theurgy:alchemical_sulfur_netherite", + "theurgy:alchemical_sulfur_uranium", + "theurgy:alchemical_sulfur_azure_silver", + "theurgy:alchemical_sulfur_zinc", + "theurgy:alchemical_sulfur_osmium", + "theurgy:alchemical_sulfur_nickel", + "theurgy:alchemical_sulfur_lead", + "theurgy:alchemical_sulfur_allthemodium", + "theurgy:alchemical_sulfur_unobtainium", + "theurgy:alchemical_sulfur_iridium", + "theurgy:alchemical_sulfur_tin", + "theurgy:alchemical_sulfur_cinnabar", + "theurgy:alchemical_sulfur_crimson_iron", + "theurgy:alchemical_sulfur_platinum", + "theurgy:alchemical_sulfur_vibranium", + "theurgy:alchemical_sulfur_diamond", + "theurgy:alchemical_sulfur_emerald", + "theurgy:alchemical_sulfur_lapis", + "theurgy:alchemical_sulfur_quartz", + "theurgy:alchemical_sulfur_amethyst", + "theurgy:alchemical_sulfur_prismarine", + "theurgy:alchemical_sulfur_ruby", + "theurgy:alchemical_sulfur_apatite", + "theurgy:alchemical_sulfur_peridot", + "theurgy:alchemical_sulfur_fluorite", + "theurgy:alchemical_sulfur_sapphire", + "theurgy:alchemical_sulfur_sal_ammoniac", + "theurgy:alchemical_sulfur_redstone", + "theurgy:alchemical_sulfur_coal", + "theurgy:alchemical_sulfur_sulfur" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/abundant.json b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/abundant.json new file mode 100644 index 000000000..55d7657bd --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/abundant.json @@ -0,0 +1,7 @@ +{ + "values": [ + "#theurgy:alchemical_sulfurs/metals/abundant", + "#theurgy:alchemical_sulfurs/gems/abundant", + "#theurgy:alchemical_sulfurs/other_minerals/abundant" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/common.json b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/common.json new file mode 100644 index 000000000..9b9ae8938 --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/common.json @@ -0,0 +1,7 @@ +{ + "values": [ + "#theurgy:alchemical_sulfurs/metals/common", + "#theurgy:alchemical_sulfurs/gems/common", + "#theurgy:alchemical_sulfurs/other_minerals/common" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/gems.json b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/gems.json new file mode 100644 index 000000000..9378ddff7 --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/gems.json @@ -0,0 +1,20 @@ +{ + "values": [ + { + "id": "#theurgy:alchemical_sulfurs/gems/abundant", + "required": false + }, + { + "id": "#theurgy:alchemical_sulfurs/gems/common", + "required": false + }, + { + "id": "#theurgy:alchemical_sulfurs/gems/rare", + "required": false + }, + { + "id": "#theurgy:alchemical_sulfurs/gems/precious", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/gems/abundant.json b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/gems/abundant.json new file mode 100644 index 000000000..83668c907 --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/gems/abundant.json @@ -0,0 +1,7 @@ +{ + "values": [ + "theurgy:alchemical_sulfur_apatite", + "theurgy:alchemical_sulfur_fluorite", + "theurgy:alchemical_sulfur_sal_ammoniac" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/gems/common.json b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/gems/common.json new file mode 100644 index 000000000..b71272932 --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/gems/common.json @@ -0,0 +1,6 @@ +{ + "values": [ + "theurgy:alchemical_sulfur_quartz", + "theurgy:alchemical_sulfur_lapis" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/gems/precious.json b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/gems/precious.json new file mode 100644 index 000000000..018f06d4b --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/gems/precious.json @@ -0,0 +1,6 @@ +{ + "values": [ + "theurgy:alchemical_sulfur_diamond", + "theurgy:alchemical_sulfur_emerald" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/gems/rare.json b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/gems/rare.json new file mode 100644 index 000000000..91020eaf8 --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/gems/rare.json @@ -0,0 +1,9 @@ +{ + "values": [ + "theurgy:alchemical_sulfur_prismarine", + "theurgy:alchemical_sulfur_amethyst", + "theurgy:alchemical_sulfur_peridot", + "theurgy:alchemical_sulfur_ruby", + "theurgy:alchemical_sulfur_sapphire" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/metals.json b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/metals.json new file mode 100644 index 000000000..4fe3d2a15 --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/metals.json @@ -0,0 +1,20 @@ +{ + "values": [ + { + "id": "#theurgy:alchemical_sulfurs/metals/abundant", + "required": false + }, + { + "id": "#theurgy:alchemical_sulfurs/metals/common", + "required": false + }, + { + "id": "#theurgy:alchemical_sulfurs/metals/rare", + "required": false + }, + { + "id": "#theurgy:alchemical_sulfurs/metals/precious", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/metals/abundant.json b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/metals/abundant.json new file mode 100644 index 000000000..c885878c0 --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/metals/abundant.json @@ -0,0 +1,5 @@ +{ + "values": [ + "theurgy:alchemical_sulfur_copper" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/metals/common.json b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/metals/common.json new file mode 100644 index 000000000..116e665e5 --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/metals/common.json @@ -0,0 +1,11 @@ +{ + "values": [ + "theurgy:alchemical_sulfur_iron", + "theurgy:alchemical_sulfur_tin", + "theurgy:alchemical_sulfur_zinc", + "theurgy:alchemical_sulfur_lead", + "theurgy:alchemical_sulfur_nickel", + "theurgy:alchemical_sulfur_cinnabar", + "theurgy:alchemical_sulfur_osmium" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/metals/precious.json b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/metals/precious.json new file mode 100644 index 000000000..337be34df --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/metals/precious.json @@ -0,0 +1,8 @@ +{ + "values": [ + "theurgy:alchemical_sulfur_netherite", + "theurgy:alchemical_sulfur_allthemodium", + "theurgy:alchemical_sulfur_unobtainium", + "theurgy:alchemical_sulfur_vibranium" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/metals/rare.json b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/metals/rare.json new file mode 100644 index 000000000..e240d0587 --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/metals/rare.json @@ -0,0 +1,11 @@ +{ + "values": [ + "theurgy:alchemical_sulfur_crimson_iron", + "theurgy:alchemical_sulfur_silver", + "theurgy:alchemical_sulfur_gold", + "theurgy:alchemical_sulfur_uranium", + "theurgy:alchemical_sulfur_azure_silver", + "theurgy:alchemical_sulfur_iridium", + "theurgy:alchemical_sulfur_platinum" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/other_minerals.json b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/other_minerals.json new file mode 100644 index 000000000..bacd46203 --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/other_minerals.json @@ -0,0 +1,20 @@ +{ + "values": [ + { + "id": "#theurgy:alchemical_sulfurs/other_minerals/abundant", + "required": false + }, + { + "id": "#theurgy:alchemical_sulfurs/other_minerals/common", + "required": false + }, + { + "id": "#theurgy:alchemical_sulfurs/other_minerals/rare", + "required": false + }, + { + "id": "#theurgy:alchemical_sulfurs/other_minerals/precious", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/other_minerals/abundant.json b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/other_minerals/abundant.json new file mode 100644 index 000000000..222234679 --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/other_minerals/abundant.json @@ -0,0 +1,5 @@ +{ + "values": [ + "theurgy:alchemical_sulfur_coal" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/other_minerals/common.json b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/other_minerals/common.json new file mode 100644 index 000000000..41e7a78dc --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/other_minerals/common.json @@ -0,0 +1,6 @@ +{ + "values": [ + "theurgy:alchemical_sulfur_redstone", + "theurgy:alchemical_sulfur_sulfur" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/other_minerals/precious.json b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/other_minerals/precious.json new file mode 100644 index 000000000..f72d209df --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/other_minerals/precious.json @@ -0,0 +1,3 @@ +{ + "values": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/other_minerals/rare.json b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/other_minerals/rare.json new file mode 100644 index 000000000..f72d209df --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/other_minerals/rare.json @@ -0,0 +1,3 @@ +{ + "values": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/precious.json b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/precious.json new file mode 100644 index 000000000..b8ed6124d --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/precious.json @@ -0,0 +1,7 @@ +{ + "values": [ + "#theurgy:alchemical_sulfurs/metals/precious", + "#theurgy:alchemical_sulfurs/gems/precious", + "#theurgy:alchemical_sulfurs/other_minerals/precious" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/rare.json b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/rare.json new file mode 100644 index 000000000..aebe9d384 --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/alchemical_sulfurs/rare.json @@ -0,0 +1,7 @@ +{ + "values": [ + "#theurgy:alchemical_sulfurs/metals/rare", + "#theurgy:alchemical_sulfurs/gems/rare", + "#theurgy:alchemical_sulfurs/other_minerals/rare" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/gems/mercury/high.json b/src/generated/resources/data/theurgy/tags/items/gems/mercury/high.json new file mode 100644 index 000000000..5b66a7b71 --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/gems/mercury/high.json @@ -0,0 +1,6 @@ +{ + "values": [ + "#forge:gems/diamond", + "#forge:gems/emerald" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/gems/mercury/low.json b/src/generated/resources/data/theurgy/tags/items/gems/mercury/low.json new file mode 100644 index 000000000..c1a7a614c --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/gems/mercury/low.json @@ -0,0 +1,14 @@ +{ + "values": [ + "#forge:gems/lapis", + "#forge:gems/quartz", + { + "id": "#forge:gems/cinnabar", + "required": false + }, + { + "id": "#forge:gems/apatite", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/gems/mercury/medium.json b/src/generated/resources/data/theurgy/tags/items/gems/mercury/medium.json new file mode 100644 index 000000000..b83bb0755 --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/gems/mercury/medium.json @@ -0,0 +1,23 @@ +{ + "values": [ + "#forge:gems/amethyst", + "#forge:gems/prismarine", + "#forge:gems/sal_ammoniac", + { + "id": "#forge:gems/ruby", + "required": false + }, + { + "id": "#forge:gems/peridot", + "required": false + }, + { + "id": "#forge:gems/fluorite", + "required": false + }, + { + "id": "#forge:gems/sapphire", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/metals/mercury/high.json b/src/generated/resources/data/theurgy/tags/items/metals/mercury/high.json new file mode 100644 index 000000000..80913a0f5 --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/metals/mercury/high.json @@ -0,0 +1,17 @@ +{ + "values": [ + "#forge:ingots/netherite", + { + "id": "#forge:ingots/allthemodium", + "required": false + }, + { + "id": "#forge:ingots/unobtainium", + "required": false + }, + { + "id": "#forge:ingots/vibranium", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/metals/mercury/low.json b/src/generated/resources/data/theurgy/tags/items/metals/mercury/low.json new file mode 100644 index 000000000..50cb0e33b --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/metals/mercury/low.json @@ -0,0 +1,30 @@ +{ + "values": [ + "#forge:ingots/iron", + "#forge:ingots/copper", + { + "id": "#forge:ingots/zinc", + "required": false + }, + { + "id": "#forge:ingots/osmium", + "required": false + }, + { + "id": "#forge:ingots/nickel", + "required": false + }, + { + "id": "#forge:ingots/lead", + "required": false + }, + { + "id": "#forge:ingots/tin", + "required": false + }, + { + "id": "#forge:ingots/cinnabar", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/metals/mercury/medium.json b/src/generated/resources/data/theurgy/tags/items/metals/mercury/medium.json new file mode 100644 index 000000000..6559d2439 --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/metals/mercury/medium.json @@ -0,0 +1,29 @@ +{ + "values": [ + "#forge:ingots/gold", + { + "id": "#forge:ingots/uranium", + "required": false + }, + { + "id": "#forge:ingots/silver", + "required": false + }, + { + "id": "#forge:ingots/azure_silver", + "required": false + }, + { + "id": "#forge:ingots/iridium", + "required": false + }, + { + "id": "#forge:ingots/crimson_iron", + "required": false + }, + { + "id": "#forge:ingots/platinum", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/ores/mercury/high.json b/src/generated/resources/data/theurgy/tags/items/ores/mercury/high.json new file mode 100644 index 000000000..f453cac8f --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/ores/mercury/high.json @@ -0,0 +1,19 @@ +{ + "values": [ + "#forge:ores/diamond", + "#forge:ores/emerald", + "#forge:ores/netherite_scrap", + { + "id": "#forge:ores/allthemodium", + "required": false + }, + { + "id": "#forge:ores/unobtainium", + "required": false + }, + { + "id": "#forge:ores/vibranium", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/ores/mercury/low.json b/src/generated/resources/data/theurgy/tags/items/ores/mercury/low.json new file mode 100644 index 000000000..f4fb75df1 --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/ores/mercury/low.json @@ -0,0 +1,42 @@ +{ + "values": [ + "#forge:ores/iron", + "#forge:ores/copper", + "#forge:ores/lapis", + "#forge:ores/quartz", + "#forge:ores/redstone", + "#forge:ores/coal", + { + "id": "#forge:ores/zinc", + "required": false + }, + { + "id": "#forge:ores/osmium", + "required": false + }, + { + "id": "#forge:ores/nickel", + "required": false + }, + { + "id": "#forge:ores/lead", + "required": false + }, + { + "id": "#forge:ores/tin", + "required": false + }, + { + "id": "#forge:ores/cinnabar", + "required": false + }, + { + "id": "#forge:ores/apatite", + "required": false + }, + { + "id": "#forge:ores/sulfur", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/ores/mercury/medium.json b/src/generated/resources/data/theurgy/tags/items/ores/mercury/medium.json new file mode 100644 index 000000000..61b7a4a45 --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/ores/mercury/medium.json @@ -0,0 +1,45 @@ +{ + "values": [ + "#forge:ores/gold", + { + "id": "#forge:ores/azure_silver", + "required": false + }, + { + "id": "#forge:ores/silver", + "required": false + }, + { + "id": "#forge:ores/uranium", + "required": false + }, + { + "id": "#forge:ores/iridium", + "required": false + }, + { + "id": "#forge:ores/platinum", + "required": false + }, + { + "id": "#forge:ores/crimson_iron", + "required": false + }, + { + "id": "#forge:ores/ruby", + "required": false + }, + { + "id": "#forge:ores/peridot", + "required": false + }, + { + "id": "#forge:ores/fluorite", + "required": false + }, + { + "id": "#forge:ores/sapphire", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/other_minerals.json b/src/generated/resources/data/theurgy/tags/items/other_minerals.json new file mode 100644 index 000000000..b35bcf1e2 --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/other_minerals.json @@ -0,0 +1,6 @@ +{ + "values": [ + "#minecraft:coals", + "#forge:dusts/redstone" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/other_minerals/mercury/high.json b/src/generated/resources/data/theurgy/tags/items/other_minerals/mercury/high.json new file mode 100644 index 000000000..f72d209df --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/other_minerals/mercury/high.json @@ -0,0 +1,3 @@ +{ + "values": [] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/other_minerals/mercury/low.json b/src/generated/resources/data/theurgy/tags/items/other_minerals/mercury/low.json new file mode 100644 index 000000000..b35bcf1e2 --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/other_minerals/mercury/low.json @@ -0,0 +1,6 @@ +{ + "values": [ + "#minecraft:coals", + "#forge:dusts/redstone" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/other_minerals/mercury/medium.json b/src/generated/resources/data/theurgy/tags/items/other_minerals/mercury/medium.json new file mode 100644 index 000000000..6dee9b614 --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/other_minerals/mercury/medium.json @@ -0,0 +1,8 @@ +{ + "values": [ + { + "id": "#forge:gems/sulfur", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/raw_materials/mercury/high.json b/src/generated/resources/data/theurgy/tags/items/raw_materials/mercury/high.json new file mode 100644 index 000000000..75fd04279 --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/raw_materials/mercury/high.json @@ -0,0 +1,16 @@ +{ + "values": [ + { + "id": "#forge:raw_materials/allthemodium", + "required": false + }, + { + "id": "#forge:raw_materials/unobtainium", + "required": false + }, + { + "id": "#forge:raw_materials/vibranium", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/raw_materials/mercury/low.json b/src/generated/resources/data/theurgy/tags/items/raw_materials/mercury/low.json new file mode 100644 index 000000000..b846d5eb7 --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/raw_materials/mercury/low.json @@ -0,0 +1,30 @@ +{ + "values": [ + "#forge:raw_materials/iron", + "#forge:raw_materials/copper", + { + "id": "#forge:raw_materials/zinc", + "required": false + }, + { + "id": "#forge:raw_materials/osmium", + "required": false + }, + { + "id": "#forge:raw_materials/nickel", + "required": false + }, + { + "id": "#forge:raw_materials/lead", + "required": false + }, + { + "id": "#forge:raw_materials/tin", + "required": false + }, + { + "id": "#forge:raw_materials/cinnabar", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/tags/items/raw_materials/mercury/medium.json b/src/generated/resources/data/theurgy/tags/items/raw_materials/mercury/medium.json new file mode 100644 index 000000000..ca0eaae07 --- /dev/null +++ b/src/generated/resources/data/theurgy/tags/items/raw_materials/mercury/medium.json @@ -0,0 +1,29 @@ +{ + "values": [ + "#forge:raw_materials/gold", + { + "id": "#forge:raw_materials/uranium", + "required": false + }, + { + "id": "#forge:raw_materials/silver", + "required": false + }, + { + "id": "#forge:raw_materials/azure_silver", + "required": false + }, + { + "id": "#forge:raw_materials/iridium", + "required": false + }, + { + "id": "#forge:raw_materials/crimson_iron", + "required": false + }, + { + "id": "#forge:raw_materials/platinum", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/worldgen/configured_feature/sal_ammoniac_ore.json b/src/generated/resources/data/theurgy/worldgen/configured_feature/sal_ammoniac_ore.json new file mode 100644 index 000000000..3ca413b82 --- /dev/null +++ b/src/generated/resources/data/theurgy/worldgen/configured_feature/sal_ammoniac_ore.json @@ -0,0 +1,27 @@ +{ + "type": "minecraft:ore", + "config": { + "discard_chance_on_air_exposure": 0.0, + "size": 9, + "targets": [ + { + "state": { + "Name": "theurgy:sal_ammoniac_ore" + }, + "target": { + "predicate_type": "minecraft:tag_match", + "tag": "minecraft:stone_ore_replaceables" + } + }, + { + "state": { + "Name": "theurgy:deepslate_sal_ammoniac_ore" + }, + "target": { + "predicate_type": "minecraft:tag_match", + "tag": "minecraft:deepslate_ore_replaceables" + } + } + ] + } +} \ No newline at end of file diff --git a/src/generated/resources/data/theurgy/worldgen/placed_feature/sal_ammoniac_ore.json b/src/generated/resources/data/theurgy/worldgen/placed_feature/sal_ammoniac_ore.json new file mode 100644 index 000000000..e80e8c285 --- /dev/null +++ b/src/generated/resources/data/theurgy/worldgen/placed_feature/sal_ammoniac_ore.json @@ -0,0 +1,27 @@ +{ + "feature": "theurgy:sal_ammoniac_ore", + "placement": [ + { + "type": "minecraft:count", + "count": 20 + }, + { + "type": "minecraft:in_square" + }, + { + "type": "minecraft:height_range", + "height": { + "type": "minecraft:trapezoid", + "max_inclusive": { + "absolute": 200 + }, + "min_inclusive": { + "absolute": -64 + } + } + }, + { + "type": "minecraft:biome" + } + ] +} \ No newline at end of file diff --git a/src/main/java/com/klikli_dev/theurgy/Theurgy.java b/src/main/java/com/klikli_dev/theurgy/Theurgy.java index 2e18708c2..be92c5313 100644 --- a/src/main/java/com/klikli_dev/theurgy/Theurgy.java +++ b/src/main/java/com/klikli_dev/theurgy/Theurgy.java @@ -6,26 +6,49 @@ package com.klikli_dev.theurgy; -import com.klikli_dev.theurgy.client.ClientSetupEventHandler; +import com.klikli_dev.modonomicon.client.render.page.PageRendererRegistry; import com.klikli_dev.theurgy.config.ClientConfig; import com.klikli_dev.theurgy.config.CommonConfig; import com.klikli_dev.theurgy.config.ServerConfig; -import com.klikli_dev.theurgy.datagen.DataGenerators; +import com.klikli_dev.theurgy.content.apparatus.calcinationoven.render.CalcinationOvenRenderer; +import com.klikli_dev.theurgy.content.apparatus.distiller.render.DistillerRenderer; +import com.klikli_dev.theurgy.content.apparatus.incubator.render.IncubatorMercuryVesselRenderer; +import com.klikli_dev.theurgy.content.apparatus.incubator.render.IncubatorSaltVesselRenderer; +import com.klikli_dev.theurgy.content.apparatus.incubator.render.IncubatorSulfurVesselRenderer; +import com.klikli_dev.theurgy.content.apparatus.liquefactioncauldron.render.LiquefactionCauldronRenderer; +import com.klikli_dev.theurgy.content.apparatus.salammoniacaccumulator.render.SalAmmoniacAccumulatorRenderer; +import com.klikli_dev.theurgy.content.apparatus.salammoniactank.render.SalAmmoniacTankRenderer; +import com.klikli_dev.theurgy.content.item.AlchemicalSaltItem; +import com.klikli_dev.theurgy.content.item.AlchemicalSulfurItem; +import com.klikli_dev.theurgy.content.item.DivinationRodItem; +import com.klikli_dev.theurgy.content.render.BlankEntityRenderer; +import com.klikli_dev.theurgy.datagen.TheurgyDataGenerators; +import com.klikli_dev.theurgy.integration.modonomicon.PageLoaders; +import com.klikli_dev.theurgy.integration.modonomicon.PageRenderers; import com.klikli_dev.theurgy.network.Networking; import com.klikli_dev.theurgy.registry.*; import com.klikli_dev.theurgy.tooltips.TooltipHandler; import com.mojang.logging.LogUtils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.item.ItemProperties; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.client.event.EntityRenderersEvent; +import net.minecraftforge.client.event.RecipesUpdatedEvent; +import net.minecraftforge.client.event.RegisterColorHandlersEvent; +import net.minecraftforge.client.model.DynamicFluidContainerModel; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.config.ModConfig; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLDedicatedServerSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import net.minecraftforge.fml.loading.FMLEnvironment; +import net.minecraftforge.registries.RegistryObject; import org.slf4j.Logger; @Mod(Theurgy.MODID) @@ -46,23 +69,36 @@ public Theurgy() { ItemRegistry.ITEMS.register(modEventBus); CreativeModeTabRegistry.CREATIVE_MODE_TABS.register(modEventBus); + SulfurRegistry.SULFURS.register(modEventBus); + SaltRegistry.SALTS.register(modEventBus); + BlockRegistry.BLOCKS.register(modEventBus); + BlockEntityRegistry.BLOCKS.register(modEventBus); + FluidTypeRegistry.FLUID_TYPES.register(modEventBus); + FluidRegistry.FLUIDS.register(modEventBus); EntityRegistry.ENTITIES.register(modEventBus); EntityDataSerializerRegistry.ENTITY_DATA_SERIALIZERS.register(modEventBus); ParticleRegistry.PARTICLES.register(modEventBus); SoundRegistry.SOUNDS.register(modEventBus); - RecipeRegistry.RECIPE_SERIALIZERS.register(modEventBus); + RecipeSerializerRegistry.RECIPE_SERIALIZERS.register(modEventBus); + RecipeTypeRegistry.RECIPE_TYPES.register(modEventBus); + MenuTypeRegistry.MENU_TYPES.register(modEventBus); modEventBus.addListener(this::onCommonSetup); modEventBus.addListener(this::onServerSetup); - modEventBus.addListener(DataGenerators::gatherData); + modEventBus.addListener(TheurgyDataGenerators::onGatherData); + modEventBus.addListener(SulfurRegistry::onBuildCreativeModTabs); + modEventBus.addListener(SaltRegistry::onBuildCreativeModTabs); + modEventBus.addListener(RecipeSerializerRegistry::onRegisterRecipeSerializers); MinecraftForge.EVENT_BUS.addListener(TooltipHandler::onItemTooltipEvent); if (FMLEnvironment.dist == Dist.CLIENT) { - modEventBus.addListener(ClientSetupEventHandler::onClientSetup); modEventBus.addListener(ParticleRegistry::registerFactories); - modEventBus.addListener(ClientSetupEventHandler::onRegisterEntityRenderers); + modEventBus.addListener(Client::onClientSetup); + modEventBus.addListener(Client::onRegisterEntityRenderers); + modEventBus.addListener(Client::onRegisterItemColors); + MinecraftForge.EVENT_BUS.addListener(Client::onRecipesUpdated); } } @@ -73,10 +109,80 @@ public static ResourceLocation loc(String path) { public void onCommonSetup(FMLCommonSetupEvent event) { Networking.registerMessages(); + PageLoaders.onCommonSetup(event); + LOGGER.info("Common setup complete."); } public void onServerSetup(FMLDedicatedServerSetupEvent event) { LOGGER.info("Dedicated server setup complete."); } + + public static class Client { + public static void onClientSetup(FMLClientSetupEvent event) { + + registerTooltipDataProviders(event); + registerItemProperties(event); + + PageRenderers.onClientSetup(event); + + LOGGER.info("Client setup complete."); + } + + public static void onRecipesUpdated(RecipesUpdatedEvent event) { + //now disable rendering of sulfurs that have no recipe -> otherwise we see "no source" sulfurs in tag recipes + //See also JeiPlugin.registerRecipes + var registryAccess = Minecraft.getInstance().level.registryAccess(); + var liquefactionRecipes = event.getRecipeManager().getAllRecipesFor(RecipeTypeRegistry.LIQUEFACTION.get()); + + SulfurRegistry.SULFURS.getEntries().stream() + .map(RegistryObject::get) + .map(AlchemicalSulfurItem.class::cast) + .filter(sulfur -> liquefactionRecipes.stream().noneMatch(r -> r.getResultItem(registryAccess) != null && r.getResultItem(registryAccess).getItem() == sulfur)).map(ItemStack::new).forEach(PageRendererRegistry::registerItemStackNotToRender); + } + + public static void registerTooltipDataProviders(FMLClientSetupEvent event) { + TooltipHandler.registerNamespaceToListenTo(MODID); + + SulfurRegistry.SULFURS.getEntries().stream().map(RegistryObject::get).map(AlchemicalSulfurItem.class::cast).forEach(sulfur -> { + if (sulfur.provideAutomaticTooltipData) { + TooltipHandler.registerTooltipDataProvider(sulfur, AlchemicalSulfurItem::getTooltipData); + } + }); + + SaltRegistry.SALTS.getEntries().stream().map(RegistryObject::get).map(AlchemicalSaltItem.class::cast).forEach(salt -> { + TooltipHandler.registerTooltipDataProvider(salt, AlchemicalSaltItem::getTooltipData); + }); + } + + public static void onRegisterEntityRenderers(EntityRenderersEvent.RegisterRenderers event) { + event.registerEntityRenderer(EntityRegistry.FOLLOW_PROJECTILE.get(), BlankEntityRenderer::new); + event.registerBlockEntityRenderer(BlockEntityRegistry.LIQUEFACTION_CAULDRON.get(), LiquefactionCauldronRenderer::new); + event.registerBlockEntityRenderer(BlockEntityRegistry.DISTILLER.get(), DistillerRenderer::new); + event.registerBlockEntityRenderer(BlockEntityRegistry.CALCINATION_OVEN.get(), CalcinationOvenRenderer::new); + event.registerBlockEntityRenderer(BlockEntityRegistry.SAL_AMMONIAC_ACCUMULATOR.get(), SalAmmoniacAccumulatorRenderer::new); + event.registerBlockEntityRenderer(BlockEntityRegistry.INCUBATOR_MERCURY_VESSEL.get(), IncubatorMercuryVesselRenderer::new); + event.registerBlockEntityRenderer(BlockEntityRegistry.INCUBATOR_SULFUR_VESSEL.get(), IncubatorSulfurVesselRenderer::new); + event.registerBlockEntityRenderer(BlockEntityRegistry.INCUBATOR_SALT_VESSEL.get(), IncubatorSaltVesselRenderer::new); + event.registerBlockEntityRenderer(BlockEntityRegistry.SAL_AMMONIAC_TANK.get(), SalAmmoniacTankRenderer::new); + } + + + public static void registerItemProperties(FMLClientSetupEvent event) { + //Not safe to call during parallel load, so register to run threadsafe + event.enqueueWork(() -> { + ItemRegistry.ITEMS.getEntries().stream().filter(item -> item.get() instanceof DivinationRodItem).forEach(item -> { + ItemProperties.register(item.get(), + TheurgyConstants.ItemProperty.DIVINATION_DISTANCE, DivinationRodItem.DistHelper.DIVINATION_DISTANCE); + LOGGER.debug("Registered Divination Rod Properties for: {}", item.getKey()); + }); + + LOGGER.debug("Finished registering Item Properties."); + }); + } + + public static void onRegisterItemColors(RegisterColorHandlersEvent.Item event) { + event.register(new DynamicFluidContainerModel.Colors(), ItemRegistry.SAL_AMMONIAC_BUCKET.get()); + } + } } diff --git a/src/main/java/com/klikli_dev/theurgy/TheurgyConstants.java b/src/main/java/com/klikli_dev/theurgy/TheurgyConstants.java index 21efcbfee..d68587140 100644 --- a/src/main/java/com/klikli_dev/theurgy/TheurgyConstants.java +++ b/src/main/java/com/klikli_dev/theurgy/TheurgyConstants.java @@ -58,15 +58,25 @@ public static class I18n { public static final String ITEM_GROUP = "itemGroup." + Theurgy.MODID; + public static class Item { + + public static final String ALCHEMICAL_SULFUR_SOURCE_SUFFIX = ".source"; + public static final String ALCHEMICAL_SALT_SOURCE_SUFFIX = ".source"; + private static final String PREFIX = "item." + Theurgy.MODID + "."; + public static final String ALCHEMICAL_SULFUR_UNKNOWN_SOURCE = PREFIX + "alchemical_sulfur.unknown_source"; + public static final String DIVINATION_ROD_UNKNOWN_LINKED_BLOCK = PREFIX + "divination_rod.unknown_linked_block"; + } + public static class Tooltip { - private static final String PREFIX = "tooltip." + Theurgy.MODID + "."; public static final String SHOW_EXTENDED = "tooltip." + Theurgy.MODID + ".show_extended"; + public static final String EXTENDED_HEADING = "tooltip." + Theurgy.MODID + ".extended_heading"; public static final String SHOW_USAGE = "tooltip." + Theurgy.MODID + ".show_usage"; + public static final String USAGE_HEADING = "tooltip." + Theurgy.MODID + ".usage_heading"; public static final String SUFFIX = ".tooltip"; public static final String EXTENDED_SUFFIX = ".tooltip.extended"; public static final String USAGE_SUFFIX = ".tooltip.usage"; - + private static final String PREFIX = "tooltip." + Theurgy.MODID + "."; public static final String DIVINATION_ROD_LINKED_TO = PREFIX + ".divination_rod.linked_to"; public static final String DIVINATION_ROD_NO_LINK = PREFIX + ".divination_rod.no_link"; public static final String DIVINATION_ROD_LAST_RESULT = PREFIX + ".divination_rod.last_result"; @@ -88,5 +98,21 @@ public static class Message { public static final String DIVINATION_ROD_NO_LINK = PREFIX + "divination_rod.no_link"; public static final String DIVINATION_ROD_ATTUNING_NOT_ALLOWED = PREFIX + "divination_rod.attuning_not_allowed"; } + + public static class JEI { + public static final String PREFIX = Theurgy.MODID + ".jei."; + public static final String CALCINATION_CATEGORY = PREFIX + "category.calcination"; + public static final String LIQUEFACTION_CATEGORY = PREFIX + "category.liquefaction"; + public static final String DISTILLATION_CATEGORY = PREFIX + "category.distillation"; + public static final String INCUBATION_CATEGORY = PREFIX + "category.incubation"; + public static final String ACCUMULATION_CATEGORY = PREFIX + "category.accumulation"; + } + + public static class Misc { + public static final String PREFIX = Theurgy.MODID + ".misc."; + + public static final String UNIT_MILLIBUCKETS = PREFIX + "unit.millibuckets"; + } } + } diff --git a/src/main/java/com/klikli_dev/theurgy/client/ClientSetupEventHandler.java b/src/main/java/com/klikli_dev/theurgy/client/ClientSetupEventHandler.java deleted file mode 100644 index 2b25da3dc..000000000 --- a/src/main/java/com/klikli_dev/theurgy/client/ClientSetupEventHandler.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2022 klikli-dev - * - * SPDX-License-Identifier: MIT - */ - -package com.klikli_dev.theurgy.client; - -import com.klikli_dev.theurgy.Theurgy; -import com.klikli_dev.theurgy.TheurgyConstants; -import com.klikli_dev.theurgy.client.render.BlankEntityRenderer; -import com.klikli_dev.theurgy.item.AlchemicalSulfurItem; -import com.klikli_dev.theurgy.item.DivinationRodItem; -import com.klikli_dev.theurgy.registry.EntityRegistry; -import com.klikli_dev.theurgy.registry.ItemRegistry; -import com.klikli_dev.theurgy.tooltips.TooltipHandler; -import net.minecraft.client.renderer.item.ItemProperties; -import net.minecraftforge.client.event.EntityRenderersEvent; -import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; - -public class ClientSetupEventHandler { - public static void onClientSetup(FMLClientSetupEvent event) { - - registerTooltipDataProviders(event); - registerItemProperties(event); - - Theurgy.LOGGER.info("Client setup complete."); - } - - public static void registerTooltipDataProviders(FMLClientSetupEvent event) { - TooltipHandler.registerNamespaceToListenTo(Theurgy.MODID); - - TooltipHandler.registerTooltipDataProvider(ItemRegistry.ALCHEMICAL_SULFUR.get(), AlchemicalSulfurItem::getTooltipData); - } - - public static void onRegisterEntityRenderers(EntityRenderersEvent.RegisterRenderers event) { - event.registerEntityRenderer(EntityRegistry.FOLLOW_PROJECTILE.get(), BlankEntityRenderer::new); - - } - - public static void registerItemProperties(FMLClientSetupEvent event) { - //Not safe to call during parallel load, so register to run threadsafe - event.enqueueWork(() -> { - ItemRegistry.ITEMS.getEntries().stream().filter(item -> item.get() instanceof DivinationRodItem).forEach(item -> { - ItemProperties.register(item.get(), - TheurgyConstants.ItemProperty.DIVINATION_DISTANCE, DivinationRodItem.DistHelper.DIVINATION_DISTANCE); - Theurgy.LOGGER.debug("Registered Divination Rod Properties for: {}", item.getKey()); - }); - - Theurgy.LOGGER.debug("Finished registering Item Properties."); - }); - } -} diff --git a/src/main/java/com/klikli_dev/theurgy/client/particle/GlowParticleData.java b/src/main/java/com/klikli_dev/theurgy/client/particle/GlowParticleData.java deleted file mode 100644 index ddb5a8000..000000000 --- a/src/main/java/com/klikli_dev/theurgy/client/particle/GlowParticleData.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2022 the original author or authors of Ars Noveau https://github.com/baileyholl/Ars-Nouveau - * - * SPDX-License-Identifier: LGPL-3.0-only - */ - - -package com.klikli_dev.theurgy.client.particle; - -import com.klikli_dev.theurgy.registry.ParticleRegistry; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.particle.Particle; -import net.minecraft.client.particle.ParticleProvider; -import net.minecraft.client.particle.SpriteSet; -import net.minecraft.core.particles.ParticleOptions; - -public class GlowParticleData implements ParticleProvider { - public static final String NAME = "glow"; - private final SpriteSet spriteSet; - - public GlowParticleData(SpriteSet sprite) { - this.spriteSet = sprite; - } - - public static ParticleOptions createData(ParticleColor color) { - return new ColorParticleTypeData(ParticleRegistry.GLOW_TYPE.get(), color, false); - } - - public static ParticleOptions createData(ParticleColor color, boolean disableDepthTest) { - return new ColorParticleTypeData(ParticleRegistry.GLOW_TYPE.get(), color, disableDepthTest, 0.25f, 0.75f, 36); - } - - public static ParticleOptions createData(ParticleColor color, boolean disableDepthTest, float size, float alpha, int age) { - return new ColorParticleTypeData(color, disableDepthTest, size, alpha, age); - } - - public static ParticleOptions createData(ParticleColor color, float size, float alpha, int age) { - return new ColorParticleTypeData(color, false, size, alpha, age); - } - - @Override - public Particle createParticle(ColorParticleTypeData data, ClientLevel worldIn, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { - return new ParticleGlow(worldIn, x, y, z, xSpeed, ySpeed, zSpeed, data.color.getRed(), data.color.getGreen(), data.color.getBlue(), data.alpha, data.size, data.age, this.spriteSet, data.disableDepthTest); - } -} \ No newline at end of file diff --git a/src/main/java/com/klikli_dev/theurgy/client/particle/GlowParticleType.java b/src/main/java/com/klikli_dev/theurgy/client/particle/GlowParticleType.java deleted file mode 100644 index bf329ab7c..000000000 --- a/src/main/java/com/klikli_dev/theurgy/client/particle/GlowParticleType.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2022 the original author or authors of Ars Noveau https://github.com/baileyholl/Ars-Nouveau - * - * SPDX-License-Identifier: LGPL-3.0-only - */ - -package com.klikli_dev.theurgy.client.particle; - -import com.mojang.serialization.Codec; -import net.minecraft.core.particles.ParticleType; - -public class GlowParticleType extends ParticleType { - public GlowParticleType() { - super(false, ColorParticleTypeData.DESERIALIZER); - } - - @Override - public Codec codec() { - return ColorParticleTypeData.CODEC; - } -} diff --git a/src/main/java/com/klikli_dev/theurgy/config/CommonConfig.java b/src/main/java/com/klikli_dev/theurgy/config/CommonConfig.java index e2fa08cab..a0899618d 100644 --- a/src/main/java/com/klikli_dev/theurgy/config/CommonConfig.java +++ b/src/main/java/com/klikli_dev/theurgy/config/CommonConfig.java @@ -8,8 +8,6 @@ import net.minecraftforge.common.ForgeConfigSpec; -import java.util.List; - public class CommonConfig { private static final CommonConfig instance = new CommonConfig(); diff --git a/src/main/java/com/klikli_dev/theurgy/config/ServerConfig.java b/src/main/java/com/klikli_dev/theurgy/config/ServerConfig.java index fe31e1491..fb08ce7b2 100644 --- a/src/main/java/com/klikli_dev/theurgy/config/ServerConfig.java +++ b/src/main/java/com/klikli_dev/theurgy/config/ServerConfig.java @@ -37,14 +37,15 @@ public static class Recipes { .map(s -> s.split(":")) .collect(Collectors.toMap(s -> s[0], s -> s[1]))); + public Recipes(ForgeConfigSpec.Builder builder) { builder.comment("Recipe Settings").push("recipes"); this.sulfurSourceToBlockMappingList = builder .comment( "A mapping of sulfur source to origin block. The key is the sulfur source, the value is the block.", - "This is used by divination rod recipes to determine which (ore-)block to scan for, if e.g. a raw metal or ingot is used to craft the sulfur used in the rod.", - "Format is: [\"source=block\", \"source=block\", ...]" + "This is used by divination rod recipes to determine which (ore-)block to scan for, if e.g. a raw metal or ingot is used to craft the sulfur used in the rod. This also works for tags, prefixed with #.", + "Format is: [\"source=block\", \"#sourcetag=#blocktag\", ...]" ) .defineList("sulfurSourceToBlockMapping", List.of(), e -> ((String) e).contains("=")); diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationCraftingBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationCraftingBehaviour.java new file mode 100644 index 000000000..0229d0a88 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationCraftingBehaviour.java @@ -0,0 +1,58 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.calcinationoven; + +import com.klikli_dev.theurgy.content.behaviour.CraftingBehaviour; +import com.klikli_dev.theurgy.content.recipe.CalcinationRecipe; +import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.common.util.Lazy; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.ItemHandlerHelper; +import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.items.wrapper.RecipeWrapper; + +import java.util.function.Supplier; + +public class CalcinationCraftingBehaviour extends CraftingBehaviour> { + public CalcinationCraftingBehaviour(BlockEntity blockEntity, Supplier inputInventorySupplier, Supplier outputInventorySupplier) { + super(blockEntity, + Lazy.of(() -> new RecipeWrapper(inputInventorySupplier.get())), + inputInventorySupplier, + outputInventorySupplier, + RecipeManager.createCheck(RecipeTypeRegistry.CALCINATION.get())); + } + + @Override + public boolean canProcess(ItemStack stack) { + if (ItemHandlerHelper.canItemStacksStack(stack, this.inputInventorySupplier.get().getStackInSlot(0))) + return true; //early out if we are already processing this type of item + + ItemStackHandler tempInv = new ItemStackHandler(1); + tempInv.setStackInSlot(0, stack); + RecipeWrapper tempRecipeWrapper = new RecipeWrapper(tempInv); + + return this.recipeCachedCheck.getRecipeFor(tempRecipeWrapper, this.blockEntity.getLevel()).isPresent(); + } + + @Override + protected int getIngredientCount(CalcinationRecipe recipe) { + return recipe.getIngredientCount(); + } + + @Override + protected int getCraftingTime(CalcinationRecipe recipe) { + return recipe.getCalcinationTime(); + } + + @Override + protected int getDefaultCraftingTime() { + return CalcinationRecipe.DEFAULT_CALCINATION_TIME; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationOvenAnimationBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationOvenAnimationBehaviour.java new file mode 100644 index 000000000..135554900 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationOvenAnimationBehaviour.java @@ -0,0 +1,58 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.calcinationoven; + +import com.klikli_dev.theurgy.content.behaviour.AnimationBehaviour; +import software.bernie.geckolib.animatable.GeoBlockEntity; +import software.bernie.geckolib.core.animation.AnimationController; +import software.bernie.geckolib.core.animation.AnimationState; +import software.bernie.geckolib.core.animation.RawAnimation; +import software.bernie.geckolib.core.object.PlayState; + +public class CalcinationOvenAnimationBehaviour extends AnimationBehaviour { + + private static final RawAnimation START_AND_ON_ANIM = RawAnimation.begin() + .thenPlay("animation.calcination_oven.start") + .thenLoop("animation.calcination_oven.on"); + private static final RawAnimation STOP_AND_OFF_ANIM = RawAnimation.begin() + .thenPlay("animation.calcination_oven.stop") + .thenLoop("animation.calcination_oven.off"); + private static final RawAnimation OFF_ANIM = RawAnimation.begin() + .thenLoop("animation.calcination_oven.off"); + private static final RawAnimation ON_ANIM = RawAnimation.begin() + .thenLoop("animation.calcination_oven.on"); + + private static final RawAnimation PLACE_AND_OFF_ANIM = RawAnimation.begin() + .thenPlay("animation.calcination_oven.place") + .thenLoop("animation.calcination_oven.off"); + + public CalcinationOvenAnimationBehaviour(CalcinationOvenBlockEntity blockEntity) { + super(blockEntity); + } + + @Override + public PlayState animationHandler(AnimationState event) { + + var isProcessing = this.blockEntity.craftingBehaviour.isProcessing(); + + if (!this.wasProcessingLastTick && !isProcessing && event.getController().getAnimationState() == AnimationController.State.STOPPED) { + event.getController().setAnimation(PLACE_AND_OFF_ANIM); + } else if (this.wasProcessingLastTick && !isProcessing && event.getController().getAnimationState() != AnimationController.State.TRANSITIONING) { + event.getController().setAnimation(STOP_AND_OFF_ANIM); + } else if (!this.wasProcessingLastTick && isProcessing && event.getController().getAnimationState() != AnimationController.State.TRANSITIONING) { + event.getController().setAnimation(START_AND_ON_ANIM); + } else if (!this.wasProcessingLastTick && !isProcessing && event.getController().getAnimationState() != AnimationController.State.RUNNING) { + event.getController().setAnimation(OFF_ANIM); + } else if (this.wasProcessingLastTick && isProcessing && event.getController().getAnimationState() != AnimationController.State.RUNNING) { + event.getController().setAnimation(ON_ANIM); + } + + this.wasProcessingLastTick = isProcessing; + + return PlayState.CONTINUE; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationOvenBlock.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationOvenBlock.java new file mode 100644 index 000000000..6d7c4408b --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationOvenBlock.java @@ -0,0 +1,183 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.calcinationoven; + +import com.klikli_dev.theurgy.content.behaviour.ItemHandlerBehaviour; +import com.klikli_dev.theurgy.content.behaviour.TwoSlotItemHandlerBehaviour; +import com.klikli_dev.theurgy.registry.BlockEntityRegistry; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.Containers; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.*; +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 net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.items.wrapper.RecipeWrapper; +import org.jetbrains.annotations.Nullable; + +public class CalcinationOvenBlock extends Block implements EntityBlock { + + public static final BooleanProperty LIT = BlockStateProperties.LIT; + public static final EnumProperty HALF = BlockStateProperties.DOUBLE_BLOCK_HALF; + protected static final VoxelShape TOP = Block.box(0, 0, 0, 16, 5, 16); + protected static final VoxelShape BOTTOM = Shapes.block(); + + protected ItemHandlerBehaviour itemHandlerBehaviour; + + public CalcinationOvenBlock(Properties pProperties) { + super(pProperties); + this.itemHandlerBehaviour = new TwoSlotItemHandlerBehaviour(); + this.registerDefaultState(this.stateDefinition.any().setValue(LIT, Boolean.FALSE).setValue(HALF, DoubleBlockHalf.LOWER)); + } + + @Override + @SuppressWarnings("deprecation") + public RenderShape getRenderShape(BlockState pState) { + //Why model for the top? because then we get the particle texture from destroying it. + return pState.getValue(HALF) == DoubleBlockHalf.LOWER ? RenderShape.ENTITYBLOCK_ANIMATED : RenderShape.MODEL; + } + + @Override + @SuppressWarnings("deprecation") + public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { + return pState.getValue(HALF) == DoubleBlockHalf.LOWER ? BOTTOM : TOP; + } + + @Override + @SuppressWarnings("deprecation") + public BlockState updateShape(BlockState pState, Direction pFacing, BlockState pFacingState, LevelAccessor pLevel, BlockPos pCurrentPos, BlockPos pFacingPos) { + //destroy both blocks if one is mined + var half = pState.getValue(HALF); + if (pFacing.getAxis() == Direction.Axis.Y && half == DoubleBlockHalf.LOWER == (pFacing == Direction.UP)) { + return pFacingState.is(this) + && pFacingState.getValue(HALF) != half ? + pState : Blocks.AIR.defaultBlockState(); + } else { + return half == DoubleBlockHalf.LOWER + && pFacing == Direction.DOWN + && !pState.canSurvive(pLevel, pCurrentPos) ? + Blocks.AIR.defaultBlockState() : + super.updateShape(pState, pFacing, pFacingState, pLevel, pCurrentPos, pFacingPos); + } + } + + @Override + protected void spawnDestroyParticles(Level pLevel, Player pPlayer, BlockPos pPos, BlockState pState) { + //also spawn for other half + var otherHalf = pPos.above(pState.getValue(HALF) == DoubleBlockHalf.LOWER ? 1 : -1); + pLevel.levelEvent(pPlayer, 2001, otherHalf, getId(pState)); + + //and for ourselves + super.spawnDestroyParticles(pLevel, pPlayer, pPos, pState); + } + + @Override + public void playerWillDestroy(Level pLevel, BlockPos pPos, BlockState pState, Player pPlayer) { + if (!pLevel.isClientSide && pPlayer.isCreative()) { + DoublePlantBlock.preventCreativeDropFromBottomPart(pLevel, pPos, pState, pPlayer); + } + + super.playerWillDestroy(pLevel, pPos, pState, pPlayer); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockPlaceContext pContext) { + BlockPos blockpos = pContext.getClickedPos(); + Level level = pContext.getLevel(); + if (blockpos.getY() < level.getMaxBuildHeight() - 1 && level.getBlockState(blockpos.above()).canBeReplaced(pContext)) { + return this.defaultBlockState().setValue(HALF, DoubleBlockHalf.LOWER).setValue(LIT, false); + } else { + return null; + } + } + + @Override + public void setPlacedBy(Level pLevel, BlockPos pPos, BlockState pState, LivingEntity pPlacer, ItemStack pStack) { + pLevel.setBlock(pPos.above(), pState.setValue(HALF, DoubleBlockHalf.UPPER), Block.UPDATE_ALL); + } + + @Override + @SuppressWarnings("deprecation") + public boolean canSurvive(BlockState pState, LevelReader pLevel, BlockPos pPos) { + BlockPos below = pPos.below(); + BlockState belowState = pLevel.getBlockState(below); + return pState.getValue(HALF) == DoubleBlockHalf.LOWER || belowState.is(this); + } + + @Override + @SuppressWarnings("deprecation") + public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { + if (pLevel.isClientSide()) { + return InteractionResult.SUCCESS; + } + + //handle top block + pPos = pState.getValue(HALF) == DoubleBlockHalf.UPPER ? pPos.below() : pPos; + + if (this.itemHandlerBehaviour.useItemHandler(pState, pLevel, pPos, pPlayer, pHand, pHit) == InteractionResult.SUCCESS) { + return InteractionResult.SUCCESS; + } + + return InteractionResult.PASS; + } + + @Override + @SuppressWarnings("deprecation") + public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { + if (!pState.is(pNewState.getBlock())) { + if (pState.getValue(HALF) == DoubleBlockHalf.LOWER && pLevel.getBlockEntity(pPos) instanceof CalcinationOvenBlockEntity blockEntity) { + Containers.dropContents(pLevel, pPos, new RecipeWrapper(blockEntity.inventory)); + } + } + super.onRemove(pState, pLevel, pPos, pNewState, pIsMoving); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder pBuilder) { + pBuilder.add(LIT, HALF); + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pPos, BlockState pState) { + return pState.getValue(HALF) == DoubleBlockHalf.LOWER ? BlockEntityRegistry.CALCINATION_OVEN.get().create(pPos, pState) : null; + } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level pLevel, BlockState pState, BlockEntityType pBlockEntityType) { + if (pLevel.isClientSide() || pState.getValue(HALF) == DoubleBlockHalf.UPPER) { + return null; + } + return (lvl, pos, blockState, t) -> { + if (t instanceof CalcinationOvenBlockEntity blockEntity) { + blockEntity.tickServer(); + } + }; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationOvenBlockEntity.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationOvenBlockEntity.java new file mode 100644 index 000000000..0176cc8e3 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationOvenBlockEntity.java @@ -0,0 +1,203 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.calcinationoven; + +import com.klikli_dev.theurgy.content.behaviour.AnimationBehaviour; +import com.klikli_dev.theurgy.content.behaviour.CraftingBehaviour; +import com.klikli_dev.theurgy.content.behaviour.HeatedBehaviour; +import com.klikli_dev.theurgy.content.behaviour.PreventInsertWrapper; +import com.klikli_dev.theurgy.registry.BlockEntityRegistry; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.Connection; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.items.wrapper.CombinedInvWrapper; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import software.bernie.geckolib.animatable.GeoBlockEntity; +import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.core.animation.AnimationController; + +public class CalcinationOvenBlockEntity extends BlockEntity implements GeoBlockEntity { + + public ItemStackHandler inputInventory; + /** + * The underlying outputInventory which allows inserting too - we use this when crafting. + */ + public ItemStackHandler outputInventory; + /** + * A wrapper that only allows taking from the outputInventory - this is what we show to the outside. + */ + public PreventInsertWrapper outputInventoryTakeOnlyWrapper; + public CombinedInvWrapper inventory; + public LazyOptional inventoryCapability; + public LazyOptional inputInventoryCapability; + public LazyOptional outputInventoryCapability; + + protected CraftingBehaviour craftingBehaviour; + protected HeatedBehaviour heatedBehaviour; + protected AnimationBehaviour animationBehaviour; + + + public CalcinationOvenBlockEntity(BlockPos pPos, BlockState pBlockState) { + super(BlockEntityRegistry.CALCINATION_OVEN.get(), pPos, pBlockState); + + this.inputInventory = new InputInventory(); + this.outputInventory = new OutputInventory(); + this.outputInventoryTakeOnlyWrapper = new PreventInsertWrapper(this.outputInventory); + + this.inventory = new CombinedInvWrapper(this.inputInventory, this.outputInventoryTakeOnlyWrapper); + + this.inventoryCapability = LazyOptional.of(() -> this.inventory); + this.inputInventoryCapability = LazyOptional.of(() -> this.inputInventory); + this.outputInventoryCapability = LazyOptional.of(() -> this.outputInventoryTakeOnlyWrapper); + + this.craftingBehaviour = new CalcinationCraftingBehaviour(this, () -> this.inputInventory, () -> this.outputInventory); + this.heatedBehaviour = new HeatedBehaviour(this); + this.animationBehaviour = new CalcinationOvenAnimationBehaviour(this); + } + + @Override + public CompoundTag getUpdateTag() { + var tag = new CompoundTag(); + this.writeNetwork(tag); + return tag; + } + + @Override + public void handleUpdateTag(CompoundTag tag) { + this.readNetwork(tag); + } + + @Nullable + @Override + public Packet getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this); + } + + @Override + public void onDataPacket(Connection connection, ClientboundBlockEntityDataPacket packet) { + var tag = packet.getTag(); + if (tag != null) { + this.readNetwork(tag); + } + } + + public void readNetwork(CompoundTag tag) { + this.craftingBehaviour.readNetwork(tag); + } + + public void writeNetwork(CompoundTag tag) { + this.craftingBehaviour.writeNetwork(tag); + } + + public void tickServer() { + boolean isHeated = this.heatedBehaviour.isHeated(); + boolean hasInput = !this.inputInventory.getStackInSlot(0).isEmpty(); + + this.craftingBehaviour.tickServer(isHeated, hasInput); + } + + @Override + public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { + if (cap == ForgeCapabilities.ITEM_HANDLER) { + if (side == Direction.UP) return this.inputInventoryCapability.cast(); + if (side == Direction.DOWN) return this.outputInventoryCapability.cast(); + return this.inventoryCapability.cast(); + } + return super.getCapability(cap, side); + } + + @Override + protected void saveAdditional(CompoundTag pTag) { + super.saveAdditional(pTag); + + pTag.put("inputInventory", this.inputInventory.serializeNBT()); + pTag.put("outputInventory", this.outputInventory.serializeNBT()); + + this.craftingBehaviour.saveAdditional(pTag); + } + + @Override + public void load(CompoundTag pTag) { + super.load(pTag); + + if (pTag.contains("inputInventory")) + this.inputInventory.deserializeNBT(pTag.getCompound("inputInventory")); + if (pTag.contains("outputInventory")) + this.outputInventory.deserializeNBT(pTag.getCompound("outputInventory")); + + this.craftingBehaviour.load(pTag); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 10, this.animationBehaviour::animationHandler)); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.animationBehaviour.getAnimatableInstanceCache(); + } + + + public class InputInventory extends ItemStackHandler { + + public InputInventory() { + super(1); + } + + @Override + public void setStackInSlot(int slot, @NotNull ItemStack newStack) { + + var oldStack = this.getStackInSlot(slot); + + boolean sameItem = !newStack.isEmpty() && ItemStack.isSameItemSameTags(newStack, oldStack); + + super.setStackInSlot(slot, newStack); + + if (!sameItem) { + CalcinationOvenBlockEntity.this.craftingBehaviour.onInputItemChanged(oldStack, newStack); + } + + } + + @Override + public boolean isItemValid(int slot, ItemStack stack) { + return CalcinationOvenBlockEntity.this.craftingBehaviour.canProcess(stack) && super.isItemValid(slot, stack); + } + + @Override + protected void onContentsChanged(int slot) { + CalcinationOvenBlockEntity.this.setChanged(); + } + } + + public class OutputInventory extends ItemStackHandler { + + public OutputInventory() { + super(1); + } + + @Override + protected void onContentsChanged(int slot) { + CalcinationOvenBlockEntity.this.setChanged(); + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationOvenBlockItem.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationOvenBlockItem.java new file mode 100644 index 000000000..457182ae8 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/CalcinationOvenBlockItem.java @@ -0,0 +1,49 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.calcinationoven; + +import com.klikli_dev.theurgy.content.apparatus.calcinationoven.render.CalcinationOvenBEWLR; +import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.function.Consumer; + +public class CalcinationOvenBlockItem extends BlockItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + public CalcinationOvenBlockItem(Block pBlock, Properties pProperties) { + super(pBlock, pProperties); + } + + + @Override + public void initializeClient(Consumer consumer) { + consumer.accept(new IClientItemExtensions() { + @Override + public BlockEntityWithoutLevelRenderer getCustomRenderer() { + return CalcinationOvenBEWLR.get(); + } + }); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + //do not show anims on item + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/render/CalcinationOvenBEWLR.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/render/CalcinationOvenBEWLR.java new file mode 100644 index 000000000..742a4f876 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/render/CalcinationOvenBEWLR.java @@ -0,0 +1,55 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.calcinationoven.render; + +import com.klikli_dev.theurgy.content.apparatus.calcinationoven.CalcinationOvenBlockItem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.model.ItemTransform; +import net.minecraft.world.item.ItemDisplayContext; +import org.joml.Matrix4f; +import org.joml.Vector3f; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoItemRenderer; + +public class CalcinationOvenBEWLR extends GeoItemRenderer { + + private static final CalcinationOvenBEWLR instance = new CalcinationOvenBEWLR(); + + private final ItemTransform transform; + + public CalcinationOvenBEWLR() { + super(new CalcinationOvenModel()); + this.withScale(0.5f); + this.transform = new ItemTransform(new Vector3f(30, 255, 0), new Vector3f(0, 0, 0), new Vector3f(1, 1, 1)); + } + + public static CalcinationOvenBEWLR get() { + return instance; + } + + @Override + public void preRender(PoseStack poseStack, CalcinationOvenBlockItem animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, + float alpha) { + //copied from parent, but fixed to also center the model when scaling + this.itemRenderTranslations = new Matrix4f(poseStack.last().pose()); + + if (this.scaleWidth != 1 && this.scaleHeight != 1) { + poseStack.scale(this.scaleWidth, this.scaleHeight, this.scaleWidth); + + //this is not as clean as I would like it - but it exactly centers the model for 0.5 scale :D + poseStack.translate(this.scaleWidth / 0.5 - 0.5, -0.1, this.scaleWidth / 0.5 - 0.5); + } + + poseStack.translate(0.5f, 0.51f, 0.5f); + + if (this.renderPerspective == ItemDisplayContext.GUI) { + this.transform.apply(false, poseStack); + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/render/CalcinationOvenModel.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/render/CalcinationOvenModel.java new file mode 100644 index 000000000..6602c32fa --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/render/CalcinationOvenModel.java @@ -0,0 +1,29 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.calcinationoven.render; + +import com.klikli_dev.theurgy.Theurgy; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.core.animatable.GeoAnimatable; +import software.bernie.geckolib.model.GeoModel; + +public class CalcinationOvenModel extends GeoModel { + @Override + public ResourceLocation getModelResource(GeoAnimatable animatable) { + return Theurgy.loc("geo/calcination_oven.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(GeoAnimatable animatable) { + return Theurgy.loc("textures/block/calcination_oven.png"); + } + + @Override + public ResourceLocation getAnimationResource(GeoAnimatable animatable) { + return Theurgy.loc("animations/calcination_oven.animation.json"); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/render/CalcinationOvenRenderer.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/render/CalcinationOvenRenderer.java new file mode 100644 index 000000000..606fc5f15 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/calcinationoven/render/CalcinationOvenRenderer.java @@ -0,0 +1,17 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.calcinationoven.render; + +import com.klikli_dev.theurgy.content.apparatus.calcinationoven.CalcinationOvenBlockEntity; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import software.bernie.geckolib.renderer.GeoBlockRenderer; + +public class CalcinationOvenRenderer extends GeoBlockRenderer { + public CalcinationOvenRenderer(BlockEntityRendererProvider.Context pContext) { + super(new CalcinationOvenModel()); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillerAnimationBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillerAnimationBehaviour.java new file mode 100644 index 000000000..24f746e18 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillerAnimationBehaviour.java @@ -0,0 +1,58 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.distiller; + +import com.klikli_dev.theurgy.content.behaviour.AnimationBehaviour; +import software.bernie.geckolib.animatable.GeoBlockEntity; +import software.bernie.geckolib.core.animation.AnimationController; +import software.bernie.geckolib.core.animation.AnimationState; +import software.bernie.geckolib.core.animation.RawAnimation; +import software.bernie.geckolib.core.object.PlayState; + +public class DistillerAnimationBehaviour extends AnimationBehaviour { + + private static final RawAnimation START_AND_ON_ANIM = RawAnimation.begin() + .thenPlay("animation.distiller.start") + .thenLoop("animation.distiller.on"); + private static final RawAnimation STOP_AND_OFF_ANIM = RawAnimation.begin() + .thenPlay("animation.distiller.stop") + .thenLoop("animation.distiller.off"); + private static final RawAnimation OFF_ANIM = RawAnimation.begin() + .thenLoop("animation.distiller.off"); + private static final RawAnimation ON_ANIM = RawAnimation.begin() + .thenLoop("animation.distiller.on"); + + public DistillerAnimationBehaviour(DistillerBlockEntity blockEntity) { + super(blockEntity); + } + + @Override + public PlayState animationHandler(AnimationState event) { + + var isProcessing = this.blockEntity.craftingBehaviour.isProcessing(); + + if (this.wasProcessingLastTick && !isProcessing && event.getController().getAnimationState() != AnimationController.State.TRANSITIONING) { + event.getController().setAnimation(STOP_AND_OFF_ANIM); + } + + if (!this.wasProcessingLastTick && isProcessing && event.getController().getAnimationState() != AnimationController.State.TRANSITIONING) { + event.getController().setAnimation(START_AND_ON_ANIM); + } + + if (!this.wasProcessingLastTick && !isProcessing && event.getController().getAnimationState() != AnimationController.State.RUNNING) { + event.getController().setAnimation(OFF_ANIM); + } + + if (this.wasProcessingLastTick && isProcessing && event.getController().getAnimationState() != AnimationController.State.RUNNING) { + event.getController().setAnimation(ON_ANIM); + } + + this.wasProcessingLastTick = isProcessing; + + return PlayState.CONTINUE; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillerBlock.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillerBlock.java new file mode 100644 index 000000000..aecd9a7fc --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillerBlock.java @@ -0,0 +1,183 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.distiller; + +import com.klikli_dev.theurgy.content.behaviour.ItemHandlerBehaviour; +import com.klikli_dev.theurgy.content.behaviour.TwoSlotItemHandlerBehaviour; +import com.klikli_dev.theurgy.registry.BlockEntityRegistry; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.Containers; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.*; +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 net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.items.wrapper.RecipeWrapper; +import org.jetbrains.annotations.Nullable; + +public class DistillerBlock extends Block implements EntityBlock { + + public static final BooleanProperty LIT = BlockStateProperties.LIT; + public static final EnumProperty HALF = BlockStateProperties.DOUBLE_BLOCK_HALF; + protected static final VoxelShape TOP = Block.box(0, 0, 0, 16, 16, 16); + protected static final VoxelShape BOTTOM = Shapes.block(); + + protected ItemHandlerBehaviour itemHandlerBehaviour; + + public DistillerBlock(Properties pProperties) { + super(pProperties); + this.itemHandlerBehaviour = new TwoSlotItemHandlerBehaviour(); + this.registerDefaultState(this.stateDefinition.any().setValue(LIT, Boolean.FALSE).setValue(HALF, DoubleBlockHalf.LOWER)); + } + + @Override + @SuppressWarnings("deprecation") + public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { + return pState.getValue(HALF) == DoubleBlockHalf.LOWER ? BOTTOM : TOP; + } + + @Override + @SuppressWarnings("deprecation") + public RenderShape getRenderShape(BlockState pState) { + //Why model for the top? because then we get the particle texture from destroying it. + return pState.getValue(HALF) == DoubleBlockHalf.LOWER ? RenderShape.ENTITYBLOCK_ANIMATED : RenderShape.MODEL; + } + + @Override + @SuppressWarnings("deprecation") + public BlockState updateShape(BlockState pState, Direction pFacing, BlockState pFacingState, LevelAccessor pLevel, BlockPos pCurrentPos, BlockPos pFacingPos) { + //destroy both blocks if one is mined + var half = pState.getValue(HALF); + if (pFacing.getAxis() == Direction.Axis.Y && half == DoubleBlockHalf.LOWER == (pFacing == Direction.UP)) { + return pFacingState.is(this) + && pFacingState.getValue(HALF) != half ? + pState : Blocks.AIR.defaultBlockState(); + } else { + return half == DoubleBlockHalf.LOWER + && pFacing == Direction.DOWN + && !pState.canSurvive(pLevel, pCurrentPos) ? + Blocks.AIR.defaultBlockState() : + super.updateShape(pState, pFacing, pFacingState, pLevel, pCurrentPos, pFacingPos); + } + } + + @Override + protected void spawnDestroyParticles(Level pLevel, Player pPlayer, BlockPos pPos, BlockState pState) { + //also spawn for other half + var otherHalf = pPos.above(pState.getValue(HALF) == DoubleBlockHalf.LOWER ? 1 : -1); + pLevel.levelEvent(pPlayer, 2001, otherHalf, getId(pState)); + + //and for ourselves + super.spawnDestroyParticles(pLevel, pPlayer, pPos, pState); + } + + @Override + public void playerWillDestroy(Level pLevel, BlockPos pPos, BlockState pState, Player pPlayer) { + if (!pLevel.isClientSide && pPlayer.isCreative()) { + DoublePlantBlock.preventCreativeDropFromBottomPart(pLevel, pPos, pState, pPlayer); + } + + super.playerWillDestroy(pLevel, pPos, pState, pPlayer); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockPlaceContext pContext) { + BlockPos blockpos = pContext.getClickedPos(); + Level level = pContext.getLevel(); + if (blockpos.getY() < level.getMaxBuildHeight() - 1 && level.getBlockState(blockpos.above()).canBeReplaced(pContext)) { + return this.defaultBlockState().setValue(HALF, DoubleBlockHalf.LOWER).setValue(LIT, false); + } else { + return null; + } + } + + @Override + public void setPlacedBy(Level pLevel, BlockPos pPos, BlockState pState, LivingEntity pPlacer, ItemStack pStack) { + pLevel.setBlock(pPos.above(), pState.setValue(HALF, DoubleBlockHalf.UPPER), Block.UPDATE_ALL); + } + + @Override + @SuppressWarnings("deprecation") + public boolean canSurvive(BlockState pState, LevelReader pLevel, BlockPos pPos) { + BlockPos below = pPos.below(); + BlockState belowState = pLevel.getBlockState(below); + return pState.getValue(HALF) == DoubleBlockHalf.LOWER || belowState.is(this); + } + + @Override + @SuppressWarnings("deprecation") + public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { + if (pLevel.isClientSide()) { + return InteractionResult.SUCCESS; + } + + //handle top block + pPos = pState.getValue(HALF) == DoubleBlockHalf.UPPER ? pPos.below() : pPos; + + if (this.itemHandlerBehaviour.useItemHandler(pState, pLevel, pPos, pPlayer, pHand, pHit) == InteractionResult.SUCCESS) { + return InteractionResult.SUCCESS; + } + + return InteractionResult.PASS; + } + + @Override + @SuppressWarnings("deprecation") + public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { + if (!pState.is(pNewState.getBlock())) { + if (pState.getValue(HALF) == DoubleBlockHalf.LOWER && pLevel.getBlockEntity(pPos) instanceof DistillerBlockEntity blockEntity) { + Containers.dropContents(pLevel, pPos, new RecipeWrapper(blockEntity.inventory)); + } + } + super.onRemove(pState, pLevel, pPos, pNewState, pIsMoving); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder pBuilder) { + pBuilder.add(LIT, HALF); + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pPos, BlockState pState) { + return pState.getValue(HALF) == DoubleBlockHalf.LOWER ? BlockEntityRegistry.DISTILLER.get().create(pPos, pState) : null; + } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level pLevel, BlockState pState, BlockEntityType pBlockEntityType) { + if (pLevel.isClientSide() || pState.getValue(HALF) == DoubleBlockHalf.UPPER) { + return null; + } + return (lvl, pos, blockState, t) -> { + if (t instanceof DistillerBlockEntity blockEntity) { + blockEntity.tickServer(); + } + }; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillerBlockEntity.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillerBlockEntity.java new file mode 100644 index 000000000..3e7bfd575 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillerBlockEntity.java @@ -0,0 +1,203 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.distiller; + +import com.klikli_dev.theurgy.content.behaviour.AnimationBehaviour; +import com.klikli_dev.theurgy.content.behaviour.CraftingBehaviour; +import com.klikli_dev.theurgy.content.behaviour.HeatedBehaviour; +import com.klikli_dev.theurgy.content.behaviour.PreventInsertWrapper; +import com.klikli_dev.theurgy.registry.BlockEntityRegistry; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.Connection; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.items.wrapper.CombinedInvWrapper; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import software.bernie.geckolib.animatable.GeoBlockEntity; +import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.core.animation.AnimationController; + +public class DistillerBlockEntity extends BlockEntity implements GeoBlockEntity { + + public ItemStackHandler inputInventory; + /** + * The underlying outputInventory which allows inserting too - we use this when crafting. + */ + public ItemStackHandler outputInventory; + /** + * A wrapper that only allows taking from the outputInventory - this is what we show to the outside. + */ + public PreventInsertWrapper outputInventoryTakeOnlyWrapper; + + public CombinedInvWrapper inventory; + public LazyOptional inventoryCapability; + public LazyOptional inputInventoryCapability; + public LazyOptional outputInventoryCapability; + + protected CraftingBehaviour craftingBehaviour; + protected HeatedBehaviour heatedBehaviour; + protected AnimationBehaviour animationBehaviour; + + public DistillerBlockEntity(BlockPos pPos, BlockState pBlockState) { + super(BlockEntityRegistry.DISTILLER.get(), pPos, pBlockState); + + this.inputInventory = new InputInventory(); + this.outputInventory = new OutputInventory(); + this.outputInventoryTakeOnlyWrapper = new PreventInsertWrapper(this.outputInventory); + + this.inventory = new CombinedInvWrapper(this.inputInventory, this.outputInventoryTakeOnlyWrapper); + + this.inventoryCapability = LazyOptional.of(() -> this.inventory); + this.inputInventoryCapability = LazyOptional.of(() -> this.inputInventory); + this.outputInventoryCapability = LazyOptional.of(() -> this.outputInventoryTakeOnlyWrapper); + + this.craftingBehaviour = new DistillerCraftingBehaviour(this, () -> this.inputInventory, () -> this.outputInventory); + this.heatedBehaviour = new HeatedBehaviour(this); + this.animationBehaviour = new DistillerAnimationBehaviour(this); + } + + @Override + public CompoundTag getUpdateTag() { + var tag = new CompoundTag(); + this.writeNetwork(tag); + return tag; + } + + @Override + public void handleUpdateTag(CompoundTag tag) { + this.readNetwork(tag); + } + + @Nullable + @Override + public Packet getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this); + } + + @Override + public void onDataPacket(Connection connection, ClientboundBlockEntityDataPacket packet) { + var tag = packet.getTag(); + if (tag != null) { + this.readNetwork(tag); + } + } + + public void readNetwork(CompoundTag tag) { + this.craftingBehaviour.readNetwork(tag); + } + + public void writeNetwork(CompoundTag tag) { + this.craftingBehaviour.writeNetwork(tag); + } + + public void tickServer() { + boolean isHeated = this.heatedBehaviour.isHeated(); + boolean hasInput = !this.inputInventory.getStackInSlot(0).isEmpty(); + + this.craftingBehaviour.tickServer(isHeated, hasInput); + } + + @Override + public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { + if (cap == ForgeCapabilities.ITEM_HANDLER) { + if (side == Direction.UP) return this.inputInventoryCapability.cast(); + if (side == Direction.DOWN) return this.outputInventoryCapability.cast(); + return this.inventoryCapability.cast(); + } + return super.getCapability(cap, side); + } + + @Override + protected void saveAdditional(CompoundTag pTag) { + super.saveAdditional(pTag); + + pTag.put("inputInventory", this.inputInventory.serializeNBT()); + pTag.put("outputInventory", this.outputInventory.serializeNBT()); + + this.craftingBehaviour.saveAdditional(pTag); + } + + @Override + public void load(CompoundTag pTag) { + super.load(pTag); + + if (pTag.contains("inputInventory")) + this.inputInventory.deserializeNBT(pTag.getCompound("inputInventory")); + if (pTag.contains("outputInventory")) + this.outputInventory.deserializeNBT(pTag.getCompound("outputInventory")); + + this.craftingBehaviour.load(pTag); + } + + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + controllerRegistrar.add(new AnimationController(this, "controller", 0, this.animationBehaviour::animationHandler)); + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.animationBehaviour.getAnimatableInstanceCache(); + } + + public class InputInventory extends ItemStackHandler { + + public InputInventory() { + super(1); + } + + @Override + public void setStackInSlot(int slot, @NotNull ItemStack newStack) { + + var oldStack = this.getStackInSlot(slot); + + boolean sameItem = !newStack.isEmpty() && ItemStack.isSameItemSameTags(newStack, oldStack); + + super.setStackInSlot(slot, newStack); + + if (!sameItem) { + DistillerBlockEntity.this.craftingBehaviour.onInputItemChanged(oldStack, newStack); + } + + } + + @Override + public boolean isItemValid(int slot, ItemStack stack) { + return DistillerBlockEntity.this.craftingBehaviour.canProcess(stack) && super.isItemValid(slot, stack); + } + + @Override + protected void onContentsChanged(int slot) { + DistillerBlockEntity.this.setChanged(); + } + } + + public class OutputInventory extends ItemStackHandler { + + public OutputInventory() { + super(1); + } + + @Override + protected void onContentsChanged(int slot) { + DistillerBlockEntity.this.setChanged(); + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillerBlockItem.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillerBlockItem.java new file mode 100644 index 000000000..f8938a4b5 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillerBlockItem.java @@ -0,0 +1,49 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.distiller; + +import com.klikli_dev.theurgy.content.apparatus.distiller.render.DistillerBEWLR; +import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.function.Consumer; + +public class DistillerBlockItem extends BlockItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + public DistillerBlockItem(Block pBlock, Properties pProperties) { + super(pBlock, pProperties); + } + + + @Override + public void initializeClient(Consumer consumer) { + consumer.accept(new IClientItemExtensions() { + @Override + public BlockEntityWithoutLevelRenderer getCustomRenderer() { + return DistillerBEWLR.get(); + } + }); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + //do not show anims on item + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillerCachedCheck.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillerCachedCheck.java new file mode 100644 index 000000000..5c8721cae --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillerCachedCheck.java @@ -0,0 +1,77 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.distiller; + +import com.klikli_dev.theurgy.content.recipe.DistillationRecipe; +import com.mojang.datafixers.util.Pair; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; +import net.minecraftforge.items.wrapper.RecipeWrapper; +import org.jetbrains.annotations.Nullable; + +import java.util.Optional; + +/** + * A custom cached check + */ +class DistillerCachedCheck implements RecipeManager.CachedCheck { + + private final RecipeType type; + private final RecipeManager.CachedCheck internal; + @Nullable + private ResourceLocation lastRecipe; + + public DistillerCachedCheck(RecipeType type) { + this.type = type; + this.internal = RecipeManager.createCheck(type); + } + + private Optional> getRecipeFor(ItemStack stack, Level level, @Nullable ResourceLocation lastRecipe) { + + var recipeManager = level.getRecipeManager(); + var map = recipeManager.byType(this.type); + if (lastRecipe != null) { + var recipe = map.get(lastRecipe); + //test only the ingredient without the (separate) ingredient count check that the recipe.matches() would. + if (recipe != null && recipe.getIngredient().test(stack)) { + return Optional.of(Pair.of(lastRecipe, recipe)); + } + } + + return map.entrySet().stream().filter((entry) -> entry.getValue().getIngredient().test(stack)).findFirst().map((entry) -> Pair.of(entry.getKey(), entry.getValue())); + } + + /** + * This checks only the ingredient, not the ingredient count + */ + public Optional getRecipeFor(ItemStack stack, Level level) { + var optional = this.getRecipeFor(stack, level, this.lastRecipe); + if (optional.isPresent()) { + var pair = optional.get(); + this.lastRecipe = pair.getFirst(); + return Optional.of(pair.getSecond()); + } else { + return Optional.empty(); + } + } + + /** + * This checks full recipe validity: ingredients + ingredient count + */ + @Override + public Optional getRecipeFor(RecipeWrapper container, Level level) { + var recipe = this.internal.getRecipeFor(container, level); + if (recipe.isPresent()) { + this.lastRecipe = recipe.get().getId(); + } + + return recipe; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillerCraftingBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillerCraftingBehaviour.java new file mode 100644 index 000000000..e2b2ad0d2 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/DistillerCraftingBehaviour.java @@ -0,0 +1,53 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.distiller; + +import com.klikli_dev.theurgy.content.behaviour.CraftingBehaviour; +import com.klikli_dev.theurgy.content.recipe.DistillationRecipe; +import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.common.util.Lazy; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.ItemHandlerHelper; +import net.minecraftforge.items.wrapper.RecipeWrapper; + +import java.util.function.Supplier; + +public class DistillerCraftingBehaviour extends CraftingBehaviour { + public DistillerCraftingBehaviour(BlockEntity blockEntity, Supplier inputInventorySupplier, Supplier outputInventorySupplier) { + super(blockEntity, + Lazy.of(() -> new RecipeWrapper(inputInventorySupplier.get())), + inputInventorySupplier, + outputInventorySupplier, + new DistillerCachedCheck(RecipeTypeRegistry.DISTILLATION.get())); + } + + @Override + public boolean canProcess(ItemStack stack) { + if (ItemHandlerHelper.canItemStacksStack(stack, this.inputInventorySupplier.get().getStackInSlot(0))) + return true; //early out if we are already processing this type of item + + + return this.recipeCachedCheck.getRecipeFor(stack, this.blockEntity.getLevel()).isPresent(); + } + + @Override + protected int getIngredientCount(DistillationRecipe recipe) { + return recipe.getIngredientCount(); + } + + @Override + protected int getCraftingTime(DistillationRecipe recipe) { + return recipe.getDistillationTime(); + } + + @Override + protected int getDefaultCraftingTime() { + return DistillationRecipe.DEFAULT_DISTILLATION_TIME; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/render/DistillerBEWLR.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/render/DistillerBEWLR.java new file mode 100644 index 000000000..babe43852 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/render/DistillerBEWLR.java @@ -0,0 +1,55 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.distiller.render; + +import com.klikli_dev.theurgy.content.apparatus.distiller.DistillerBlockItem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.model.ItemTransform; +import net.minecraft.world.item.ItemDisplayContext; +import org.joml.Matrix4f; +import org.joml.Vector3f; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoItemRenderer; + +public class DistillerBEWLR extends GeoItemRenderer { + + private static final DistillerBEWLR instance = new DistillerBEWLR(); + private final ItemTransform transform; + + public DistillerBEWLR() { + super(new DistillerModel()); + this.withScale(0.35f); + this.transform = new ItemTransform(new Vector3f(30, 255, 0), new Vector3f(0, 0, 0), new Vector3f(1, 1, 1)); + } + + public static DistillerBEWLR get() { + return instance; + } + + @Override + public void preRender(PoseStack poseStack, DistillerBlockItem animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, + float alpha) { + + //copied from parent, but fixed to also center the model when scaling + this.itemRenderTranslations = new Matrix4f(poseStack.last().pose()); + + if (this.scaleWidth != 1 && this.scaleHeight != 1) { + poseStack.scale(this.scaleWidth, this.scaleHeight, this.scaleWidth); + + //this is not as clean as I would like it - but it exactly centers the model for 0.35 scale :D + poseStack.translate(this.scaleWidth / 0.5 + 0.15, -0.1, this.scaleWidth / 0.5 + 0.15); + } + + poseStack.translate(0.5f, 0.51f, 0.5f); + + if (this.renderPerspective == ItemDisplayContext.GUI) { + this.transform.apply(false, poseStack); + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/render/DistillerModel.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/render/DistillerModel.java new file mode 100644 index 000000000..b12be9a60 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/render/DistillerModel.java @@ -0,0 +1,29 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.distiller.render; + +import com.klikli_dev.theurgy.Theurgy; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.core.animatable.GeoAnimatable; +import software.bernie.geckolib.model.GeoModel; + +public class DistillerModel extends GeoModel { + @Override + public ResourceLocation getModelResource(GeoAnimatable animatable) { + return Theurgy.loc("geo/distiller.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(GeoAnimatable animatable) { + return Theurgy.loc("textures/block/distiller.png"); + } + + @Override + public ResourceLocation getAnimationResource(GeoAnimatable animatable) { + return Theurgy.loc("animations/distiller.animation.json"); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/render/DistillerRenderer.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/render/DistillerRenderer.java new file mode 100644 index 000000000..f8595263f --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/distiller/render/DistillerRenderer.java @@ -0,0 +1,17 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.distiller.render; + +import com.klikli_dev.theurgy.content.apparatus.distiller.DistillerBlockEntity; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import software.bernie.geckolib.renderer.GeoBlockRenderer; + +public class DistillerRenderer extends GeoBlockRenderer { + public DistillerRenderer(BlockEntityRendererProvider.Context pContext) { + super(new DistillerModel()); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorBlock.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorBlock.java new file mode 100644 index 000000000..8e1f713d2 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorBlock.java @@ -0,0 +1,227 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.incubator; + +import com.klikli_dev.theurgy.content.behaviour.ItemHandlerBehaviour; +import com.klikli_dev.theurgy.content.behaviour.OneSlotItemHandlerBehaviour; +import com.klikli_dev.theurgy.registry.BlockEntityRegistry; +import com.klikli_dev.theurgy.registry.BlockTagRegistry; +import net.minecraft.Util; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.Containers; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.*; +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 net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.items.wrapper.RecipeWrapper; +import org.jetbrains.annotations.Nullable; + +import java.util.Map; + +public class IncubatorBlock extends Block implements EntityBlock { + public static final BooleanProperty NORTH = PipeBlock.NORTH; + public static final BooleanProperty EAST = PipeBlock.EAST; + public static final BooleanProperty SOUTH = PipeBlock.SOUTH; + public static final BooleanProperty WEST = PipeBlock.WEST; + public static final EnumProperty HALF = BlockStateProperties.DOUBLE_BLOCK_HALF; + protected static final Map PROPERTY_BY_DIRECTION = PipeBlock.PROPERTY_BY_DIRECTION.entrySet().stream().filter((entry) -> entry.getKey().getAxis().isHorizontal()).collect(Util.toMap()); + + //-16 because we exported it from a two block high blockbench model and this is the upper half + protected static final VoxelShape TOP = Shapes.or( + Block.box(0, 28 - 16, 0, 16, 30 - 16, 16), + Block.box(1, 0, 1, 15, 28 - 16, 15) + ); + + protected static final VoxelShape BOTTOM = Shapes.or( + Block.box(0, 0, 0, 16, 4, 16), + Block.box(2, 4, 2, 14, 10, 14), + Block.box(1, 10, 1, 15, 16, 15) + ); + + protected ItemHandlerBehaviour itemHandlerBehaviour; + + public IncubatorBlock(Properties pProperties) { + super(pProperties); + this.itemHandlerBehaviour = new OneSlotItemHandlerBehaviour(); + this.registerDefaultState(this.stateDefinition.any() + .setValue(HALF, DoubleBlockHalf.LOWER) + .setValue(NORTH, false) + .setValue(EAST, false) + .setValue(SOUTH, false) + .setValue(WEST, false)); + } + + @Override + @SuppressWarnings("deprecation") + public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { + return pState.getValue(HALF) == DoubleBlockHalf.LOWER ? BOTTOM : TOP; + } + + @Override + @SuppressWarnings("deprecation") + public BlockState updateShape(BlockState pState, Direction pFacing, BlockState pFacingState, LevelAccessor pLevel, BlockPos pCurrentPos, BlockPos pFacingPos) { + + if (pLevel.getBlockEntity(pCurrentPos) instanceof IncubatorBlockEntity incubatorBlockEntity) { + incubatorBlockEntity.validateMultiblock(); + } + + //destroy both blocks if one is mined + var half = pState.getValue(HALF); + if (pFacing.getAxis() == Direction.Axis.Y && half == DoubleBlockHalf.LOWER == (pFacing == Direction.UP)) { + return pFacingState.is(this) + && pFacingState.getValue(HALF) != half ? + pState : Blocks.AIR.defaultBlockState(); + } else if (pFacing.getAxis().getPlane() == Direction.Plane.HORIZONTAL) { + return pState.setValue(PROPERTY_BY_DIRECTION.get(pFacing), this.isVessel(pFacingState)); + } else { + return half == DoubleBlockHalf.LOWER + && pFacing == Direction.DOWN + && !pState.canSurvive(pLevel, pCurrentPos) ? + Blocks.AIR.defaultBlockState() : + super.updateShape(pState, pFacing, pFacingState, pLevel, pCurrentPos, pFacingPos); + } + } + + @Override + protected void spawnDestroyParticles(Level pLevel, Player pPlayer, BlockPos pPos, BlockState pState) { + //also spawn for other half + var otherHalf = pPos.above(pState.getValue(HALF) == DoubleBlockHalf.LOWER ? 1 : -1); + pLevel.levelEvent(pPlayer, 2001, otherHalf, getId(pState)); + + //and for ourselves + super.spawnDestroyParticles(pLevel, pPlayer, pPos, pState); + } + + @Override + public void playerWillDestroy(Level pLevel, BlockPos pPos, BlockState pState, Player pPlayer) { + if (!pLevel.isClientSide && pPlayer.isCreative()) { + DoublePlantBlock.preventCreativeDropFromBottomPart(pLevel, pPos, pState, pPlayer); + } + + super.playerWillDestroy(pLevel, pPos, pState, pPlayer); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockPlaceContext pContext) { + BlockPos blockpos = pContext.getClickedPos(); + Level level = pContext.getLevel(); + if (blockpos.getY() < level.getMaxBuildHeight() - 1 && level.getBlockState(blockpos.above()).canBeReplaced(pContext)) { + + BlockState north = level.getBlockState(blockpos.north()); + BlockState east = level.getBlockState(blockpos.east()); + BlockState south = level.getBlockState(blockpos.south()); + BlockState west = level.getBlockState(blockpos.west()); + return super.getStateForPlacement(pContext) + .setValue(NORTH, this.isVessel(north)) + .setValue(EAST, this.isVessel(east)) + .setValue(SOUTH, this.isVessel(south)) + .setValue(WEST, this.isVessel(west)) + .setValue(HALF, DoubleBlockHalf.LOWER); + } else { + return null; + } + } + + @Override + public void setPlacedBy(Level pLevel, BlockPos pPos, BlockState pState, LivingEntity pPlacer, ItemStack pStack) { + pLevel.setBlock(pPos.above(), pState.setValue(HALF, DoubleBlockHalf.UPPER), Block.UPDATE_ALL); + } + + @Override + @SuppressWarnings("deprecation") + public boolean canSurvive(BlockState pState, LevelReader pLevel, BlockPos pPos) { + BlockPos below = pPos.below(); + BlockState belowState = pLevel.getBlockState(below); + return pState.getValue(HALF) == DoubleBlockHalf.LOWER || belowState.is(this); + } + + @Override + @SuppressWarnings("deprecation") + public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { + if (pLevel.isClientSide()) { + return InteractionResult.SUCCESS; + } + + //handle top block + pPos = pState.getValue(HALF) == DoubleBlockHalf.UPPER ? pPos.below() : pPos; + + if (this.itemHandlerBehaviour.useItemHandler(pState, pLevel, pPos, pPlayer, pHand, pHit) == InteractionResult.SUCCESS) { + return InteractionResult.SUCCESS; + } + + return InteractionResult.PASS; + } + + @Override + @SuppressWarnings("deprecation") + public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { + if (!pState.is(pNewState.getBlock())) { + if (pState.getValue(HALF) == DoubleBlockHalf.LOWER && pLevel.getBlockEntity(pPos) instanceof IncubatorBlockEntity blockEntity) { + Containers.dropContents(pLevel, pPos, new RecipeWrapper(blockEntity.outputInventory)); + } + } + super.onRemove(pState, pLevel, pPos, pNewState, pIsMoving); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder pBuilder) { + pBuilder.add(HALF, NORTH, EAST, WEST, SOUTH); + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pPos, BlockState pState) { + return pState.getValue(HALF) == DoubleBlockHalf.LOWER ? BlockEntityRegistry.INCUBATOR.get().create(pPos, pState) : null; + } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level pLevel, BlockState pState, BlockEntityType pBlockEntityType) { + if (pState.getValue(HALF) == DoubleBlockHalf.UPPER) { + return null; + } + if (pLevel.isClientSide()) { + return (lvl, pos, blockState, t) -> { + if (t instanceof IncubatorBlockEntity blockEntity) { + blockEntity.tickClient(); + } + }; + } + + return (lvl, pos, blockState, t) -> { + if (t instanceof IncubatorBlockEntity blockEntity) { + blockEntity.tickServer(); + } + }; + } + + public boolean isVessel(BlockState pState) { + return pState.is(BlockTagRegistry.INCUBATOR_VESSELS); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorBlockEntity.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorBlockEntity.java new file mode 100644 index 000000000..8032bbacf --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorBlockEntity.java @@ -0,0 +1,248 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.incubator; + +import com.klikli_dev.theurgy.content.behaviour.CraftingBehaviour; +import com.klikli_dev.theurgy.content.behaviour.HeatedBehaviour; +import com.klikli_dev.theurgy.content.behaviour.PreventInsertWrapper; +import com.klikli_dev.theurgy.content.recipe.wrapper.IncubatorRecipeWrapper; +import com.klikli_dev.theurgy.registry.BlockEntityRegistry; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.Connection; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemStackHandler; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class IncubatorBlockEntity extends BlockEntity { + public IncubatorMercuryVesselBlockEntity mercuryVessel; + public IncubatorSulfurVesselBlockEntity sulfurVessel; + public IncubatorSaltVesselBlockEntity saltVessel; + + /** + * The underlying outputInventory which allows inserting too - we use this when crafting. + */ + public ItemStackHandler outputInventory; + /** + * A wrapper that only allows taking from the outputInventory - this is what we show to the outside. + */ + public PreventInsertWrapper outputInventoryTakeOnlyWrapper; + public LazyOptional outputInventoryCapability; + + public IncubatorRecipeWrapper recipeWrapper; + public boolean isValidMultiblock; + + protected CraftingBehaviour craftingBehaviour; + protected HeatedBehaviour heatedBehaviour; + protected boolean checkValidMultiblockOnNextQuery; + + public IncubatorBlockEntity(BlockPos pPos, BlockState pBlockState) { + super(BlockEntityRegistry.INCUBATOR.get(), pPos, pBlockState); + + this.outputInventory = new OutputInventory(); + this.outputInventoryTakeOnlyWrapper = new PreventInsertWrapper(this.outputInventory); + this.outputInventoryCapability = LazyOptional.of(() -> this.outputInventoryTakeOnlyWrapper); + this.checkValidMultiblockOnNextQuery = true; + + this.craftingBehaviour = new IncubatorCraftingBehaviour(this, () -> this.recipeWrapper, () -> null, () -> this.outputInventory); + this.heatedBehaviour = new HeatedBehaviour(this); + } + + @Override + public CompoundTag getUpdateTag() { + var tag = new CompoundTag(); + this.writeNetwork(tag); + return tag; + } + + @Override + public void handleUpdateTag(CompoundTag tag) { + this.readNetwork(tag); + } + + @Nullable + @Override + public Packet getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this); + } + + @Override + public void onDataPacket(Connection connection, ClientboundBlockEntityDataPacket packet) { + var tag = packet.getTag(); + if (tag != null) { + this.readNetwork(tag); + } + } + + public void readNetwork(CompoundTag tag) { + this.craftingBehaviour.readNetwork(tag); + } + + public void writeNetwork(CompoundTag tag) { + this.craftingBehaviour.writeNetwork(tag); + } + + public void tickServer() { + boolean isHeated = this.heatedBehaviour.isHeated(); + + boolean hasInput = this.isValidMultiblock() + && !this.mercuryVessel.inputInventory.getStackInSlot(0).isEmpty() + && !this.saltVessel.inputInventory.getStackInSlot(0).isEmpty() + && !this.sulfurVessel.inputInventory.getStackInSlot(0).isEmpty(); + + this.craftingBehaviour.tickServer(isHeated, hasInput); + } + + public void tickClient() { + var isProcessing = this.craftingBehaviour.isProcessing(); + if (isProcessing) { + var random = this.getLevel().getRandom(); + if (random.nextFloat() < 0.11F) { + for (int i = 0; i < random.nextInt(2) + 2; ++i) { + this.getLevel().addParticle(ParticleTypes.CAMPFIRE_COSY_SMOKE, + this.getBlockPos().getX() + 0.5 + random.nextFloat() / 3.0 * (random.nextBoolean() ? 1 : -1), + this.getBlockPos().getY() + 2 + random.nextFloat(), + this.getBlockPos().getZ() + 0.5 + random.nextFloat() / 3.0 * (random.nextBoolean() ? 1 : -1), + 0, 0.07, 0 + ); + } + } + } + } + + + @Override + public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { + if (cap == ForgeCapabilities.ITEM_HANDLER) { + return this.outputInventoryCapability.cast(); + } + return super.getCapability(cap, side); + } + + @Override + protected void saveAdditional(CompoundTag pTag) { + super.saveAdditional(pTag); + + pTag.put("outputInventory", this.outputInventory.serializeNBT()); + + this.craftingBehaviour.saveAdditional(pTag); + } + + @Override + public void load(CompoundTag pTag) { + super.load(pTag); + + if (pTag.contains("outputInventory")) + this.outputInventory.deserializeNBT(pTag.getCompound("outputInventory")); + + this.craftingBehaviour.load(pTag); + } + + private void checkForVessel(BlockPos pos) { + BlockEntity blockEntity = this.level.getBlockEntity(pos); + if (blockEntity instanceof IncubatorMercuryVesselBlockEntity mercury) { + this.mercuryVessel = mercury; + mercury.setIncubator(this); + } else if (blockEntity instanceof IncubatorSulfurVesselBlockEntity sulfur) { + this.sulfurVessel = sulfur; + sulfur.setIncubator(this); + } else if (blockEntity instanceof IncubatorSaltVesselBlockEntity salt) { + this.saltVessel = salt; + salt.setIncubator(this); + } + } + + public void validateMultiblock() { + var oldMercuryVessel = this.mercuryVessel; + var oldSaltVessel = this.saltVessel; + var oldSulfurVessel = this.sulfurVessel; + var wasValidMultiblock = this.isValidMultiblock; + + this.mercuryVessel = null; + this.saltVessel = null; + this.sulfurVessel = null; + + Direction.Plane.HORIZONTAL.stream().forEach(direction -> { + BlockPos pos = this.getBlockPos().relative(direction); + this.checkForVessel(pos); + }); + + this.isValidMultiblock = this.mercuryVessel != null && this.sulfurVessel != null && this.saltVessel != null; + if (wasValidMultiblock != this.isValidMultiblock) { + if (this.isValidMultiblock) { + this.onAssembleMultiblock(); + } else { + this.onDisassembleMultiblock(); + } + } + + if (oldMercuryVessel != this.mercuryVessel || oldSaltVessel != this.saltVessel || oldSulfurVessel != this.sulfurVessel) { + this.onVesselItemChanged(); + } + } + + public void onAssembleMultiblock() { + this.recipeWrapper = new IncubatorRecipeWrapper(this.mercuryVessel.inputInventory, this.saltVessel.inputInventory, this.sulfurVessel.inputInventory); + } + + public void onDisassembleMultiblock() { + this.recipeWrapper = null; + } + + public void onVesselItemChanged() { + this.craftingBehaviour.onInputItemChanged(ItemStack.EMPTY, ItemStack.EMPTY); + } + + @Override + public void setRemoved() { + if (this.mercuryVessel != null) { + this.mercuryVessel.setIncubator(null); + this.mercuryVessel = null; + } + if (this.sulfurVessel != null) { + this.sulfurVessel.setIncubator(null); + this.sulfurVessel = null; + } + if (this.saltVessel != null) { + this.saltVessel.setIncubator(null); + this.saltVessel = null; + } + super.setRemoved(); + } + + public boolean isValidMultiblock() { + if (this.checkValidMultiblockOnNextQuery) { + this.checkValidMultiblockOnNextQuery = false; + this.validateMultiblock(); + } + return this.isValidMultiblock; + } + + public class OutputInventory extends ItemStackHandler { + + public OutputInventory() { + super(1); + } + + @Override + protected void onContentsChanged(int slot) { + IncubatorBlockEntity.this.setChanged(); + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorCraftingBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorCraftingBehaviour.java new file mode 100644 index 000000000..cdcfe47ff --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorCraftingBehaviour.java @@ -0,0 +1,73 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.incubator; + +import com.klikli_dev.theurgy.content.behaviour.CraftingBehaviour; +import com.klikli_dev.theurgy.content.recipe.IncubationRecipe; +import com.klikli_dev.theurgy.content.recipe.wrapper.IncubatorRecipeWrapper; +import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.ItemHandlerHelper; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Supplier; + +public class IncubatorCraftingBehaviour extends CraftingBehaviour> { + public IncubatorCraftingBehaviour(BlockEntity blockEntity, Supplier recipeWrapperSupplier, Supplier inputInventorySupplier, Supplier outputInventorySupplier) { + super(blockEntity, + recipeWrapperSupplier, + inputInventorySupplier, + outputInventorySupplier, + RecipeManager.createCheck(RecipeTypeRegistry.INCUBATION.get())); + } + + @Override + public boolean canProcess(ItemStack stack) { + return true; //not used because the vessels handle their input on their own. + } + + @Override + protected boolean craft(@Nullable IncubationRecipe pRecipe) { + if (!this.canCraft(pRecipe)) + return false; + + var recipeWrapper = this.recipeWrapperSupplier.get(); + var assembledStack = pRecipe.assemble(recipeWrapper, this.blockEntity.getLevel().registryAccess()); + + // Safely insert the assembledStack into the outputInventory and update the input stack. + ItemHandlerHelper.insertItemStacked(this.outputInventorySupplier.get(), assembledStack, false); + + recipeWrapper.getMercuryVesselInv().extractItem(0, 1, false); + recipeWrapper.getSaltVesselInv().extractItem(0, 1, false); + recipeWrapper.getSulfurVesselInv().extractItem(0, 1, false); + + return true; + } + + @Override + protected int getIngredientCount(IncubationRecipe recipe) { + return 1; + } + + @Override + protected int getCraftingTime(IncubationRecipe recipe) { + return recipe.getIncubationTime(); + } + + @Override + protected int getDefaultCraftingTime() { + return IncubationRecipe.DEFAULT_INCUBATION_TIME; + } + + @Override + protected int getTotalTime() { + return this.recipeWrapperSupplier.get() != null ? super.getTotalTime() : this.getDefaultCraftingTime(); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorMercuryVesselBlock.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorMercuryVesselBlock.java new file mode 100644 index 000000000..bd5cab131 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorMercuryVesselBlock.java @@ -0,0 +1,72 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.incubator; + +import com.klikli_dev.theurgy.content.behaviour.ItemHandlerBehaviour; +import com.klikli_dev.theurgy.content.behaviour.OneSlotItemHandlerBehaviour; +import com.klikli_dev.theurgy.registry.BlockEntityRegistry; +import net.minecraft.core.BlockPos; +import net.minecraft.world.Containers; +import net.minecraft.world.InteractionHand; +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.EntityBlock; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraftforge.items.wrapper.RecipeWrapper; +import org.jetbrains.annotations.Nullable; + +public class IncubatorMercuryVesselBlock extends Block implements EntityBlock { + protected ItemHandlerBehaviour itemHandlerBehaviour; + + public IncubatorMercuryVesselBlock(Properties pProperties) { + super(pProperties); + this.itemHandlerBehaviour = new OneSlotItemHandlerBehaviour(); + } + + @Override + @SuppressWarnings("deprecation") + public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { + if (!pState.is(pNewState.getBlock())) { + if (pLevel.getBlockEntity(pPos) instanceof IncubatorMercuryVesselBlockEntity blockEntity) { + Containers.dropContents(pLevel, pPos, new RecipeWrapper(blockEntity.inputInventory)); + } + } + super.onRemove(pState, pLevel, pPos, pNewState, pIsMoving); + } + + @Override + @SuppressWarnings("deprecation") + public RenderShape getRenderShape(BlockState pState) { + //Why model for the top? because then we get the particle texture from destroying it. + return RenderShape.ENTITYBLOCK_ANIMATED; + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pPos, BlockState pState) { + return BlockEntityRegistry.INCUBATOR_MERCURY_VESSEL.get().create(pPos, pState); + } + + @Override + @SuppressWarnings("deprecation") + public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { + if (pLevel.isClientSide()) { + return InteractionResult.SUCCESS; + } + + if (this.itemHandlerBehaviour.useItemHandler(pState, pLevel, pPos, pPlayer, pHand, pHit) == InteractionResult.SUCCESS) { + return InteractionResult.SUCCESS; + } + + return InteractionResult.PASS; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorMercuryVesselBlockEntity.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorMercuryVesselBlockEntity.java new file mode 100644 index 000000000..37caefb12 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorMercuryVesselBlockEntity.java @@ -0,0 +1,110 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.incubator; + +import com.klikli_dev.theurgy.registry.BlockEntityRegistry; +import com.klikli_dev.theurgy.registry.ItemTagRegistry; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemStackHandler; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import software.bernie.geckolib.animatable.GeoBlockEntity; +import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.util.GeckoLibUtil; + +public class IncubatorMercuryVesselBlockEntity extends BlockEntity implements GeoBlockEntity { + + protected final AnimatableInstanceCache animatableInstanceCache = GeckoLibUtil.createInstanceCache(this); + public IncubatorBlockEntity incubator; + public ItemStackHandler inputInventory; + public LazyOptional inputInventoryCapability; + + public IncubatorMercuryVesselBlockEntity(BlockPos pPos, BlockState pBlockState) { + super(BlockEntityRegistry.INCUBATOR_MERCURY_VESSEL.get(), pPos, pBlockState); + + this.inputInventory = new InputInventory(); + this.inputInventoryCapability = LazyOptional.of(() -> this.inputInventory); + } + + @Override + protected void saveAdditional(CompoundTag pTag) { + super.saveAdditional(pTag); + pTag.put("inputInventory", this.inputInventory.serializeNBT()); + } + + @Override + public void load(CompoundTag pTag) { + super.load(pTag); + + if (pTag.contains("inputInventory")) + this.inputInventory.deserializeNBT(pTag.getCompound("inputInventory")); + } + + @Override + public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { + if (cap == ForgeCapabilities.ITEM_HANDLER) { + return this.inputInventoryCapability.cast(); + } + return super.getCapability(cap, side); + } + + public void setIncubator(IncubatorBlockEntity incubator) { + this.incubator = incubator; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.animatableInstanceCache; + } + + public class InputInventory extends ItemStackHandler { + + public InputInventory() { + super(1); + } + + @Override + public void setStackInSlot(int slot, @NotNull ItemStack newStack) { + + var oldStack = this.getStackInSlot(slot); + + boolean sameItem = !newStack.isEmpty() && ItemStack.isSameItemSameTags(newStack, oldStack); + + super.setStackInSlot(slot, newStack); + + if (!sameItem) { + if (IncubatorMercuryVesselBlockEntity.this.incubator != null) + IncubatorMercuryVesselBlockEntity.this.incubator.onVesselItemChanged(); + } + } + + @Override + public boolean isItemValid(int slot, ItemStack stack) { + return stack.is(ItemTagRegistry.ALCHEMICAL_MERCURIES) && super.isItemValid(slot, stack); + } + + @Override + protected void onContentsChanged(int slot) { + IncubatorMercuryVesselBlockEntity.this.setChanged(); + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorMercuryVesselBlockItem.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorMercuryVesselBlockItem.java new file mode 100644 index 000000000..bf46d2938 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorMercuryVesselBlockItem.java @@ -0,0 +1,49 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.incubator; + +import com.klikli_dev.theurgy.content.apparatus.incubator.render.IncubatorMercuryVesselBEWLR; +import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.function.Consumer; + +public class IncubatorMercuryVesselBlockItem extends BlockItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + public IncubatorMercuryVesselBlockItem(Block pBlock, Properties pProperties) { + super(pBlock, pProperties); + } + + + @Override + public void initializeClient(Consumer consumer) { + consumer.accept(new IClientItemExtensions() { + @Override + public BlockEntityWithoutLevelRenderer getCustomRenderer() { + return IncubatorMercuryVesselBEWLR.get(); + } + }); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + //do not show anims on item + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorSaltVesselBlock.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorSaltVesselBlock.java new file mode 100644 index 000000000..fbc58c308 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorSaltVesselBlock.java @@ -0,0 +1,73 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.incubator; + +import com.klikli_dev.theurgy.content.behaviour.ItemHandlerBehaviour; +import com.klikli_dev.theurgy.content.behaviour.OneSlotItemHandlerBehaviour; +import com.klikli_dev.theurgy.registry.BlockEntityRegistry; +import net.minecraft.core.BlockPos; +import net.minecraft.world.Containers; +import net.minecraft.world.InteractionHand; +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.EntityBlock; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraftforge.items.wrapper.RecipeWrapper; +import org.jetbrains.annotations.Nullable; + +public class IncubatorSaltVesselBlock extends Block implements EntityBlock { + + protected ItemHandlerBehaviour itemHandlerBehaviour; + + public IncubatorSaltVesselBlock(Properties pProperties) { + super(pProperties); + this.itemHandlerBehaviour = new OneSlotItemHandlerBehaviour(); + } + + @Override + @SuppressWarnings("deprecation") + public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { + if (!pState.is(pNewState.getBlock())) { + if (pLevel.getBlockEntity(pPos) instanceof IncubatorSaltVesselBlockEntity blockEntity) { + Containers.dropContents(pLevel, pPos, new RecipeWrapper(blockEntity.inputInventory)); + } + } + super.onRemove(pState, pLevel, pPos, pNewState, pIsMoving); + } + + @Override + @SuppressWarnings("deprecation") + public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { + if (pLevel.isClientSide()) { + return InteractionResult.SUCCESS; + } + + if (this.itemHandlerBehaviour.useItemHandler(pState, pLevel, pPos, pPlayer, pHand, pHit) == InteractionResult.SUCCESS) { + return InteractionResult.SUCCESS; + } + + return InteractionResult.PASS; + } + + @Override + @SuppressWarnings("deprecation") + public RenderShape getRenderShape(BlockState pState) { + //Why model for the top? because then we get the particle texture from destroying it. + return RenderShape.ENTITYBLOCK_ANIMATED; + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pPos, BlockState pState) { + return BlockEntityRegistry.INCUBATOR_SALT_VESSEL.get().create(pPos, pState); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorSaltVesselBlockEntity.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorSaltVesselBlockEntity.java new file mode 100644 index 000000000..ce33d2431 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorSaltVesselBlockEntity.java @@ -0,0 +1,113 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.incubator; + +import com.klikli_dev.theurgy.registry.BlockEntityRegistry; +import com.klikli_dev.theurgy.registry.ItemTagRegistry; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemStackHandler; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import software.bernie.geckolib.animatable.GeoBlockEntity; +import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.util.GeckoLibUtil; + +public class IncubatorSaltVesselBlockEntity extends BlockEntity implements GeoBlockEntity { + + protected final AnimatableInstanceCache animatableInstanceCache = GeckoLibUtil.createInstanceCache(this); + + public IncubatorBlockEntity incubator; + + public ItemStackHandler inputInventory; + + public LazyOptional inputInventoryCapability; + + public IncubatorSaltVesselBlockEntity(BlockPos pPos, BlockState pBlockState) { + super(BlockEntityRegistry.INCUBATOR_SALT_VESSEL.get(), pPos, pBlockState); + + this.inputInventory = new InputInventory(); + this.inputInventoryCapability = LazyOptional.of(() -> this.inputInventory); + } + + @Override + protected void saveAdditional(CompoundTag pTag) { + super.saveAdditional(pTag); + pTag.put("inputInventory", this.inputInventory.serializeNBT()); + } + + @Override + public void load(CompoundTag pTag) { + super.load(pTag); + + if (pTag.contains("inputInventory")) + this.inputInventory.deserializeNBT(pTag.getCompound("inputInventory")); + } + + @Override + public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { + if (cap == ForgeCapabilities.ITEM_HANDLER) { + return this.inputInventoryCapability.cast(); + } + return super.getCapability(cap, side); + } + + public void setIncubator(IncubatorBlockEntity incubator) { + this.incubator = incubator; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.animatableInstanceCache; + } + + public class InputInventory extends ItemStackHandler { + + public InputInventory() { + super(1); + } + + @Override + public void setStackInSlot(int slot, @NotNull ItemStack newStack) { + + var oldStack = this.getStackInSlot(slot); + + boolean sameItem = !newStack.isEmpty() && ItemStack.isSameItemSameTags(newStack, oldStack); + + super.setStackInSlot(slot, newStack); + + if (!sameItem) { + if (IncubatorSaltVesselBlockEntity.this.incubator != null) + IncubatorSaltVesselBlockEntity.this.incubator.onVesselItemChanged(); + } + } + + @Override + public boolean isItemValid(int slot, ItemStack stack) { + return stack.is(ItemTagRegistry.ALCHEMICAL_SALTS) && super.isItemValid(slot, stack); + } + + @Override + protected void onContentsChanged(int slot) { + IncubatorSaltVesselBlockEntity.this.setChanged(); + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorSaltVesselBlockItem.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorSaltVesselBlockItem.java new file mode 100644 index 000000000..a543a3e23 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorSaltVesselBlockItem.java @@ -0,0 +1,49 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.incubator; + +import com.klikli_dev.theurgy.content.apparatus.incubator.render.IncubatorSaltVesselBEWLR; +import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.function.Consumer; + +public class IncubatorSaltVesselBlockItem extends BlockItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + public IncubatorSaltVesselBlockItem(Block pBlock, Properties pProperties) { + super(pBlock, pProperties); + } + + + @Override + public void initializeClient(Consumer consumer) { + consumer.accept(new IClientItemExtensions() { + @Override + public BlockEntityWithoutLevelRenderer getCustomRenderer() { + return IncubatorSaltVesselBEWLR.get(); + } + }); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + //do not show anims on item + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorSulfurVesselBlock.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorSulfurVesselBlock.java new file mode 100644 index 000000000..a4a6dc9bc --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorSulfurVesselBlock.java @@ -0,0 +1,72 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.incubator; + +import com.klikli_dev.theurgy.content.behaviour.ItemHandlerBehaviour; +import com.klikli_dev.theurgy.content.behaviour.OneSlotItemHandlerBehaviour; +import com.klikli_dev.theurgy.registry.BlockEntityRegistry; +import net.minecraft.core.BlockPos; +import net.minecraft.world.Containers; +import net.minecraft.world.InteractionHand; +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.EntityBlock; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraftforge.items.wrapper.RecipeWrapper; +import org.jetbrains.annotations.Nullable; + +public class IncubatorSulfurVesselBlock extends Block implements EntityBlock { + protected ItemHandlerBehaviour itemHandlerBehaviour; + + public IncubatorSulfurVesselBlock(Properties pProperties) { + super(pProperties); + this.itemHandlerBehaviour = new OneSlotItemHandlerBehaviour(); + } + + @Override + @SuppressWarnings("deprecation") + public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { + if (!pState.is(pNewState.getBlock())) { + if (pLevel.getBlockEntity(pPos) instanceof IncubatorSulfurVesselBlockEntity blockEntity) { + Containers.dropContents(pLevel, pPos, new RecipeWrapper(blockEntity.inputInventory)); + } + } + super.onRemove(pState, pLevel, pPos, pNewState, pIsMoving); + } + + @Override + @SuppressWarnings("deprecation") + public RenderShape getRenderShape(BlockState pState) { + //Why model for the top? because then we get the particle texture from destroying it. + return RenderShape.ENTITYBLOCK_ANIMATED; + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pPos, BlockState pState) { + return BlockEntityRegistry.INCUBATOR_SULFUR_VESSEL.get().create(pPos, pState); + } + + @Override + @SuppressWarnings("deprecation") + public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { + if (pLevel.isClientSide()) { + return InteractionResult.SUCCESS; + } + + if (this.itemHandlerBehaviour.useItemHandler(pState, pLevel, pPos, pPlayer, pHand, pHit) == InteractionResult.SUCCESS) { + return InteractionResult.SUCCESS; + } + + return InteractionResult.PASS; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorSulfurVesselBlockEntity.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorSulfurVesselBlockEntity.java new file mode 100644 index 000000000..73d72e2e1 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorSulfurVesselBlockEntity.java @@ -0,0 +1,113 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.incubator; + +import com.klikli_dev.theurgy.registry.BlockEntityRegistry; +import com.klikli_dev.theurgy.registry.ItemTagRegistry; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemStackHandler; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import software.bernie.geckolib.animatable.GeoBlockEntity; +import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.util.GeckoLibUtil; + +public class IncubatorSulfurVesselBlockEntity extends BlockEntity implements GeoBlockEntity { + + protected final AnimatableInstanceCache animatableInstanceCache = GeckoLibUtil.createInstanceCache(this); + + public IncubatorBlockEntity incubator; + + public ItemStackHandler inputInventory; + + public LazyOptional inputInventoryCapability; + + public IncubatorSulfurVesselBlockEntity(BlockPos pPos, BlockState pBlockState) { + super(BlockEntityRegistry.INCUBATOR_SULFUR_VESSEL.get(), pPos, pBlockState); + + this.inputInventory = new InputInventory(); + this.inputInventoryCapability = LazyOptional.of(() -> this.inputInventory); + } + + @Override + protected void saveAdditional(CompoundTag pTag) { + super.saveAdditional(pTag); + pTag.put("inputInventory", this.inputInventory.serializeNBT()); + } + + @Override + public void load(CompoundTag pTag) { + super.load(pTag); + + if (pTag.contains("inputInventory")) + this.inputInventory.deserializeNBT(pTag.getCompound("inputInventory")); + } + + @Override + public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { + if (cap == ForgeCapabilities.ITEM_HANDLER) { + return this.inputInventoryCapability.cast(); + } + return super.getCapability(cap, side); + } + + public void setIncubator(IncubatorBlockEntity incubator) { + this.incubator = incubator; + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.animatableInstanceCache; + } + + public class InputInventory extends ItemStackHandler { + + public InputInventory() { + super(1); + } + + @Override + public void setStackInSlot(int slot, @NotNull ItemStack newStack) { + + var oldStack = this.getStackInSlot(slot); + + boolean sameItem = !newStack.isEmpty() && ItemStack.isSameItemSameTags(newStack, oldStack); + + super.setStackInSlot(slot, newStack); + + if (!sameItem) { + if (IncubatorSulfurVesselBlockEntity.this.incubator != null) + IncubatorSulfurVesselBlockEntity.this.incubator.onVesselItemChanged(); + } + } + + @Override + public boolean isItemValid(int slot, ItemStack stack) { + return stack.is(ItemTagRegistry.ALCHEMICAL_SULFURS) && super.isItemValid(slot, stack); + } + + @Override + protected void onContentsChanged(int slot) { + IncubatorSulfurVesselBlockEntity.this.setChanged(); + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorSulfurVesselBlockItem.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorSulfurVesselBlockItem.java new file mode 100644 index 000000000..10467d4de --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/IncubatorSulfurVesselBlockItem.java @@ -0,0 +1,49 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.incubator; + +import com.klikli_dev.theurgy.content.apparatus.incubator.render.IncubatorSulfurVesselBEWLR; +import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.function.Consumer; + +public class IncubatorSulfurVesselBlockItem extends BlockItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + public IncubatorSulfurVesselBlockItem(Block pBlock, Properties pProperties) { + super(pBlock, pProperties); + } + + + @Override + public void initializeClient(Consumer consumer) { + consumer.accept(new IClientItemExtensions() { + @Override + public BlockEntityWithoutLevelRenderer getCustomRenderer() { + return IncubatorSulfurVesselBEWLR.get(); + } + }); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + //do not show anims on item + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/render/IncubatorMercuryVesselBEWLR.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/render/IncubatorMercuryVesselBEWLR.java new file mode 100644 index 000000000..63241a92c --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/render/IncubatorMercuryVesselBEWLR.java @@ -0,0 +1,54 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.incubator.render; + +import com.klikli_dev.theurgy.content.apparatus.incubator.IncubatorMercuryVesselBlockItem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.model.ItemTransform; +import net.minecraft.world.item.ItemDisplayContext; +import org.joml.Matrix4f; +import org.joml.Vector3f; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoItemRenderer; + +public class IncubatorMercuryVesselBEWLR extends GeoItemRenderer { + + private static final IncubatorMercuryVesselBEWLR instance = new IncubatorMercuryVesselBEWLR(); + private final ItemTransform transform; + + public IncubatorMercuryVesselBEWLR() { + super(new IncubatorMercuryVesselModel()); + this.withScale(0.5f); + this.transform = new ItemTransform(new Vector3f(30, 255, 0), new Vector3f(0, 0, 0), new Vector3f(1, 1, 1)); + } + + public static IncubatorMercuryVesselBEWLR get() { + return instance; + } + + @Override + public void preRender(PoseStack poseStack, IncubatorMercuryVesselBlockItem animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, + float alpha) { + //copied from parent, but fixed to also center the model when scaling + this.itemRenderTranslations = new Matrix4f(poseStack.last().pose()); + + if (this.scaleWidth != 1 && this.scaleHeight != 1) { + poseStack.scale(this.scaleWidth, this.scaleHeight, this.scaleWidth); + + //this is not as clean as I would like it - but it exactly centers the model for 0.5 scale :D + poseStack.translate(this.scaleWidth / 0.5 - 0.5, -0.1, this.scaleWidth / 0.5 - 0.5); + } + + poseStack.translate(0.5f, 0.51f, 0.5f); + + if (this.renderPerspective == ItemDisplayContext.GUI) { + this.transform.apply(false, poseStack); + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/render/IncubatorMercuryVesselModel.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/render/IncubatorMercuryVesselModel.java new file mode 100644 index 000000000..1b795229d --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/render/IncubatorMercuryVesselModel.java @@ -0,0 +1,29 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.incubator.render; + +import com.klikli_dev.theurgy.Theurgy; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.core.animatable.GeoAnimatable; +import software.bernie.geckolib.model.GeoModel; + +public class IncubatorMercuryVesselModel extends GeoModel { + @Override + public ResourceLocation getModelResource(GeoAnimatable animatable) { + return Theurgy.loc("geo/incubator_vessel.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(GeoAnimatable animatable) { + return Theurgy.loc("textures/block/incubator_vessel_gold.png"); + } + + @Override + public ResourceLocation getAnimationResource(GeoAnimatable animatable) { + return Theurgy.loc(""); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/render/IncubatorMercuryVesselRenderer.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/render/IncubatorMercuryVesselRenderer.java new file mode 100644 index 000000000..7a0a6e8e3 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/render/IncubatorMercuryVesselRenderer.java @@ -0,0 +1,17 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.incubator.render; + +import com.klikli_dev.theurgy.content.apparatus.incubator.IncubatorMercuryVesselBlockEntity; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import software.bernie.geckolib.renderer.GeoBlockRenderer; + +public class IncubatorMercuryVesselRenderer extends GeoBlockRenderer { + public IncubatorMercuryVesselRenderer(BlockEntityRendererProvider.Context pContext) { + super(new IncubatorMercuryVesselModel()); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/render/IncubatorSaltVesselBEWLR.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/render/IncubatorSaltVesselBEWLR.java new file mode 100644 index 000000000..500a78b93 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/render/IncubatorSaltVesselBEWLR.java @@ -0,0 +1,54 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.incubator.render; + +import com.klikli_dev.theurgy.content.apparatus.incubator.IncubatorSaltVesselBlockItem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.model.ItemTransform; +import net.minecraft.world.item.ItemDisplayContext; +import org.joml.Matrix4f; +import org.joml.Vector3f; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoItemRenderer; + +public class IncubatorSaltVesselBEWLR extends GeoItemRenderer { + + private static final IncubatorSaltVesselBEWLR instance = new IncubatorSaltVesselBEWLR(); + private final ItemTransform transform; + + public IncubatorSaltVesselBEWLR() { + super(new IncubatorSaltVesselModel()); + this.withScale(0.5f); + this.transform = new ItemTransform(new Vector3f(30, 255, 0), new Vector3f(0, 0, 0), new Vector3f(1, 1, 1)); + } + + public static IncubatorSaltVesselBEWLR get() { + return instance; + } + + @Override + public void preRender(PoseStack poseStack, IncubatorSaltVesselBlockItem animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, + float alpha) { + //copied from parent, but fixed to also center the model when scaling + this.itemRenderTranslations = new Matrix4f(poseStack.last().pose()); + + if (this.scaleWidth != 1 && this.scaleHeight != 1) { + poseStack.scale(this.scaleWidth, this.scaleHeight, this.scaleWidth); + + //this is not as clean as I would like it - but it exactly centers the model for 0.5 scale :D + poseStack.translate(this.scaleWidth / 0.5 - 0.5, -0.1, this.scaleWidth / 0.5 - 0.5); + } + + poseStack.translate(0.5f, 0.51f, 0.5f); + + if (this.renderPerspective == ItemDisplayContext.GUI) { + this.transform.apply(false, poseStack); + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/render/IncubatorSaltVesselModel.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/render/IncubatorSaltVesselModel.java new file mode 100644 index 000000000..c56f34175 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/render/IncubatorSaltVesselModel.java @@ -0,0 +1,29 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.incubator.render; + +import com.klikli_dev.theurgy.Theurgy; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.core.animatable.GeoAnimatable; +import software.bernie.geckolib.model.GeoModel; + +public class IncubatorSaltVesselModel extends GeoModel { + @Override + public ResourceLocation getModelResource(GeoAnimatable animatable) { + return Theurgy.loc("geo/incubator_vessel.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(GeoAnimatable animatable) { + return Theurgy.loc("textures/block/incubator_vessel_bronze.png"); + } + + @Override + public ResourceLocation getAnimationResource(GeoAnimatable animatable) { + return Theurgy.loc(""); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/render/IncubatorSaltVesselRenderer.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/render/IncubatorSaltVesselRenderer.java new file mode 100644 index 000000000..294c5503a --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/render/IncubatorSaltVesselRenderer.java @@ -0,0 +1,17 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.incubator.render; + +import com.klikli_dev.theurgy.content.apparatus.incubator.IncubatorSaltVesselBlockEntity; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import software.bernie.geckolib.renderer.GeoBlockRenderer; + +public class IncubatorSaltVesselRenderer extends GeoBlockRenderer { + public IncubatorSaltVesselRenderer(BlockEntityRendererProvider.Context pContext) { + super(new IncubatorSaltVesselModel()); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/render/IncubatorSulfurVesselBEWLR.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/render/IncubatorSulfurVesselBEWLR.java new file mode 100644 index 000000000..3d652b706 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/render/IncubatorSulfurVesselBEWLR.java @@ -0,0 +1,54 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.incubator.render; + +import com.klikli_dev.theurgy.content.apparatus.incubator.IncubatorSulfurVesselBlockItem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.model.ItemTransform; +import net.minecraft.world.item.ItemDisplayContext; +import org.joml.Matrix4f; +import org.joml.Vector3f; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoItemRenderer; + +public class IncubatorSulfurVesselBEWLR extends GeoItemRenderer { + + private static final IncubatorSulfurVesselBEWLR instance = new IncubatorSulfurVesselBEWLR(); + private final ItemTransform transform; + + public IncubatorSulfurVesselBEWLR() { + super(new IncubatorSulfurVesselModel()); + this.withScale(0.5f); + this.transform = new ItemTransform(new Vector3f(30, 255, 0), new Vector3f(0, 0, 0), new Vector3f(1, 1, 1)); + } + + public static IncubatorSulfurVesselBEWLR get() { + return instance; + } + + @Override + public void preRender(PoseStack poseStack, IncubatorSulfurVesselBlockItem animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, + float alpha) { + //copied from parent, but fixed to also center the model when scaling + this.itemRenderTranslations = new Matrix4f(poseStack.last().pose()); + + if (this.scaleWidth != 1 && this.scaleHeight != 1) { + poseStack.scale(this.scaleWidth, this.scaleHeight, this.scaleWidth); + + //this is not as clean as I would like it - but it exactly centers the model for 0.5 scale :D + poseStack.translate(this.scaleWidth / 0.5 - 0.5, -0.1, this.scaleWidth / 0.5 - 0.5); + } + + poseStack.translate(0.5f, 0.51f, 0.5f); + + if (this.renderPerspective == ItemDisplayContext.GUI) { + this.transform.apply(false, poseStack); + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/render/IncubatorSulfurVesselModel.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/render/IncubatorSulfurVesselModel.java new file mode 100644 index 000000000..73504795d --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/render/IncubatorSulfurVesselModel.java @@ -0,0 +1,29 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.incubator.render; + +import com.klikli_dev.theurgy.Theurgy; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.core.animatable.GeoAnimatable; +import software.bernie.geckolib.model.GeoModel; + +public class IncubatorSulfurVesselModel extends GeoModel { + @Override + public ResourceLocation getModelResource(GeoAnimatable animatable) { + return Theurgy.loc("geo/incubator_vessel.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(GeoAnimatable animatable) { + return Theurgy.loc("textures/block/incubator_vessel_iron.png"); + } + + @Override + public ResourceLocation getAnimationResource(GeoAnimatable animatable) { + return Theurgy.loc(""); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/render/IncubatorSulfurVesselRenderer.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/render/IncubatorSulfurVesselRenderer.java new file mode 100644 index 000000000..f83e7edbf --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/incubator/render/IncubatorSulfurVesselRenderer.java @@ -0,0 +1,17 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.incubator.render; + +import com.klikli_dev.theurgy.content.apparatus.incubator.IncubatorSulfurVesselBlockEntity; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import software.bernie.geckolib.renderer.GeoBlockRenderer; + +public class IncubatorSulfurVesselRenderer extends GeoBlockRenderer { + public IncubatorSulfurVesselRenderer(BlockEntityRendererProvider.Context pContext) { + super(new IncubatorSulfurVesselModel()); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/liquefactioncauldron/LiquefactionCauldronBlock.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/liquefactioncauldron/LiquefactionCauldronBlock.java new file mode 100644 index 000000000..0b355dad8 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/liquefactioncauldron/LiquefactionCauldronBlock.java @@ -0,0 +1,195 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.liquefactioncauldron; + +import com.klikli_dev.theurgy.content.behaviour.FluidHandlerBehaviour; +import com.klikli_dev.theurgy.content.behaviour.ItemHandlerBehaviour; +import com.klikli_dev.theurgy.content.behaviour.OneTankFluidHandlerBehaviour; +import com.klikli_dev.theurgy.content.behaviour.TwoSlotItemHandlerBehaviour; +import com.klikli_dev.theurgy.registry.BlockEntityRegistry; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.Containers; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.DoublePlantBlock; +import net.minecraft.world.level.block.EntityBlock; +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 net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; +import net.minecraft.world.level.block.state.properties.EnumProperty; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.minecraftforge.items.wrapper.RecipeWrapper; +import org.jetbrains.annotations.Nullable; + +public class LiquefactionCauldronBlock extends Block implements EntityBlock { + + public static final BooleanProperty LIT = BlockStateProperties.LIT; + + public static final EnumProperty HALF = BlockStateProperties.DOUBLE_BLOCK_HALF; + protected static final VoxelShape TOP = Block.box(0, 0, 0, 16, 6, 16); + protected static final VoxelShape BOTTOM = Shapes.block(); + + protected ItemHandlerBehaviour itemHandlerBehaviour; + protected FluidHandlerBehaviour fluidHandlerBehaviour; + + public LiquefactionCauldronBlock(Properties pProperties) { + super(pProperties); + this.itemHandlerBehaviour = new TwoSlotItemHandlerBehaviour(); + this.fluidHandlerBehaviour = new OneTankFluidHandlerBehaviour(); + this.registerDefaultState(this.stateDefinition.any().setValue(LIT, Boolean.FALSE).setValue(HALF, DoubleBlockHalf.LOWER)); + } + + @Override + @SuppressWarnings("deprecation") + public VoxelShape getShape(BlockState pState, BlockGetter pLevel, BlockPos pPos, CollisionContext pContext) { + return pState.getValue(HALF) == DoubleBlockHalf.LOWER ? BOTTOM : TOP; + } + + @Override + @SuppressWarnings("deprecation") + public BlockState updateShape(BlockState pState, Direction pFacing, BlockState pFacingState, LevelAccessor pLevel, BlockPos pCurrentPos, BlockPos pFacingPos) { + //destroy both blocks if one is mined + var half = pState.getValue(HALF); + if (pFacing.getAxis() == Direction.Axis.Y && half == DoubleBlockHalf.LOWER == (pFacing == Direction.UP)) { + return pFacingState.is(this) + && pFacingState.getValue(HALF) != half ? + pState : Blocks.AIR.defaultBlockState(); + } else { + return half == DoubleBlockHalf.LOWER + && pFacing == Direction.DOWN + && !pState.canSurvive(pLevel, pCurrentPos) ? + Blocks.AIR.defaultBlockState() : + super.updateShape(pState, pFacing, pFacingState, pLevel, pCurrentPos, pFacingPos); + } + } + + @Override + protected void spawnDestroyParticles(Level pLevel, Player pPlayer, BlockPos pPos, BlockState pState) { + //also spawn for other half + var otherHalf = pPos.above(pState.getValue(HALF) == DoubleBlockHalf.LOWER ? 1 : -1); + pLevel.levelEvent(pPlayer, 2001, otherHalf, getId(pState)); + + //and for ourselves + super.spawnDestroyParticles(pLevel, pPlayer, pPos, pState); + } + + @Override + public void playerWillDestroy(Level pLevel, BlockPos pPos, BlockState pState, Player pPlayer) { + if (!pLevel.isClientSide && pPlayer.isCreative()) { + DoublePlantBlock.preventCreativeDropFromBottomPart(pLevel, pPos, pState, pPlayer); + } + + super.playerWillDestroy(pLevel, pPos, pState, pPlayer); + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockPlaceContext pContext) { + BlockPos blockpos = pContext.getClickedPos(); + Level level = pContext.getLevel(); + if (blockpos.getY() < level.getMaxBuildHeight() - 1 && level.getBlockState(blockpos.above()).canBeReplaced(pContext)) { + return this.defaultBlockState().setValue(HALF, DoubleBlockHalf.LOWER).setValue(LIT, false); + } else { + return null; + } + } + + @Override + public void setPlacedBy(Level pLevel, BlockPos pPos, BlockState pState, LivingEntity pPlacer, ItemStack pStack) { + pLevel.setBlock(pPos.above(), pState.setValue(HALF, DoubleBlockHalf.UPPER), Block.UPDATE_ALL); + } + + @Override + @SuppressWarnings("deprecation") + public boolean canSurvive(BlockState pState, LevelReader pLevel, BlockPos pPos) { + BlockPos below = pPos.below(); + BlockState belowState = pLevel.getBlockState(below); + return pState.getValue(HALF) == DoubleBlockHalf.LOWER || belowState.is(this); + } + + @Override + @SuppressWarnings("deprecation") + public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { + if (pLevel.isClientSide()) { + return InteractionResult.SUCCESS; + } + + //handle top block + pPos = pState.getValue(HALF) == DoubleBlockHalf.UPPER ? pPos.below() : pPos; + + if (this.fluidHandlerBehaviour.useFluidHandler(pState, pLevel, pPos, pPlayer, pHand, pHit) == InteractionResult.SUCCESS) { + return InteractionResult.SUCCESS; + } + + if (this.itemHandlerBehaviour.useItemHandler(pState, pLevel, pPos, pPlayer, pHand, pHit) == InteractionResult.SUCCESS) { + return InteractionResult.SUCCESS; + } + + return InteractionResult.PASS; + } + + @Override + @SuppressWarnings("deprecation") + public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { + if (!pState.is(pNewState.getBlock())) { + if (pState.getValue(HALF) == DoubleBlockHalf.LOWER && pLevel.getBlockEntity(pPos) instanceof LiquefactionCauldronBlockEntity blockEntity) { + Containers.dropContents(pLevel, pPos, new RecipeWrapper(blockEntity.inventory)); + } + } + super.onRemove(pState, pLevel, pPos, pNewState, pIsMoving); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder pBuilder) { + pBuilder.add(LIT, HALF); + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pPos, BlockState pState) { + return pState.getValue(HALF) == DoubleBlockHalf.LOWER ? BlockEntityRegistry.LIQUEFACTION_CAULDRON.get().create(pPos, pState) : null; + } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level pLevel, BlockState pState, BlockEntityType pBlockEntityType) { + if (pState.getValue(HALF) == DoubleBlockHalf.UPPER) { + return null; + } + if (pLevel.isClientSide()) { + return (lvl, pos, blockState, t) -> { + if (t instanceof LiquefactionCauldronBlockEntity blockEntity) { + blockEntity.tickClient(); + } + }; + } + return (lvl, pos, blockState, t) -> { + if (t instanceof LiquefactionCauldronBlockEntity blockEntity) { + blockEntity.tickServer(); + } + }; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/liquefactioncauldron/LiquefactionCauldronBlockEntity.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/liquefactioncauldron/LiquefactionCauldronBlockEntity.java new file mode 100644 index 000000000..145c20cb1 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/liquefactioncauldron/LiquefactionCauldronBlockEntity.java @@ -0,0 +1,251 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.liquefactioncauldron; + +import com.klikli_dev.theurgy.content.behaviour.CraftingBehaviour; +import com.klikli_dev.theurgy.content.behaviour.HeatedBehaviour; +import com.klikli_dev.theurgy.content.behaviour.PreventInsertWrapper; +import com.klikli_dev.theurgy.content.particle.ParticleColor; +import com.klikli_dev.theurgy.content.particle.coloredbubble.ColoredBubbleParticleProvider; +import com.klikli_dev.theurgy.registry.BlockEntityRegistry; +import com.klikli_dev.theurgy.registry.FluidTagRegistry; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.Connection; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidType; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.templates.FluidTank; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemStackHandler; +import net.minecraftforge.items.wrapper.CombinedInvWrapper; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Predicate; + +public class LiquefactionCauldronBlockEntity extends BlockEntity { + + public ItemStackHandler inputInventory; + /** + * The underlying outputInventory which allows inserting too - we use this when crafting. + */ + public ItemStackHandler outputInventory; + /** + * A wrapper that only allows taking from the outputInventory - this is what we show to the outside. + */ + public PreventInsertWrapper outputInventoryTakeOnlyWrapper; + + public CombinedInvWrapper inventory; + public LazyOptional inventoryCapability; + public LazyOptional inputInventoryCapability; + public LazyOptional outputInventoryCapability; + + public FluidTank solventTank; + public LazyOptional solventTankCapability; + + protected CraftingBehaviour craftingBehaviour; + protected HeatedBehaviour heatedBehaviour; + + + public LiquefactionCauldronBlockEntity(BlockPos pPos, BlockState pBlockState) { + super(BlockEntityRegistry.LIQUEFACTION_CAULDRON.get(), pPos, pBlockState); + + this.inputInventory = new InputInventory(); + this.outputInventory = new OutputInventory(); + this.outputInventoryTakeOnlyWrapper = new PreventInsertWrapper(this.outputInventory); + this.inventory = new CombinedInvWrapper(this.inputInventory, this.outputInventoryTakeOnlyWrapper); + + this.inventoryCapability = LazyOptional.of(() -> this.inventory); + this.inputInventoryCapability = LazyOptional.of(() -> this.inputInventory); + this.outputInventoryCapability = LazyOptional.of(() -> this.outputInventoryTakeOnlyWrapper); + + this.solventTank = new SolventTank(FluidType.BUCKET_VOLUME, (fluidStack -> ForgeRegistries.FLUIDS.tags().getTag(FluidTagRegistry.SOLVENT).contains(fluidStack.getFluid()))); + + this.solventTankCapability = LazyOptional.of(() -> this.solventTank); + + this.craftingBehaviour = new LiquefactionCauldronCraftingBehaviour(this, () -> this.inputInventory, () -> this.outputInventory, () -> this.solventTank); + this.heatedBehaviour = new HeatedBehaviour(this); + } + + @Override + public CompoundTag getUpdateTag() { + var tag = new CompoundTag(); + this.writeNetwork(tag); + return tag; + } + + @Override + public void handleUpdateTag(CompoundTag tag) { + this.readNetwork(tag); + } + + @Nullable + @Override + public Packet getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this); + } + + @Override + public void onDataPacket(Connection connection, ClientboundBlockEntityDataPacket packet) { + var tag = packet.getTag(); + if (tag != null) { + this.readNetwork(tag); + } + } + + public void readNetwork(CompoundTag tag) { + if (tag.contains("solventTank")) { + this.solventTank.readFromNBT(tag.getCompound("solventTank")); + } + + this.craftingBehaviour.readNetwork(tag); + } + + public void writeNetwork(CompoundTag tag) { + tag.put("solventTank", this.solventTank.writeToNBT(new CompoundTag())); + + this.craftingBehaviour.writeNetwork(tag); + } + + public void sendBlockUpdated() { + if (this.level != null && !this.level.isClientSide) + this.level.sendBlockUpdated(this.getBlockPos(), this.getBlockState(), this.getBlockState(), Block.UPDATE_CLIENTS); + } + + public void tickServer() { + boolean isHeated = this.heatedBehaviour.isHeated(); + boolean hasInput = !this.inputInventory.getStackInSlot(0).isEmpty(); + + this.craftingBehaviour.tickServer(isHeated, hasInput); + } + + public void tickClient() { + var isProcessing = this.craftingBehaviour.isProcessing(); + if (isProcessing) { + if (this.getLevel().getGameTime() % 2 == 0) { // only spawn particles every 2 ticks + this.getLevel().addParticle( + ColoredBubbleParticleProvider.createOptions(new ParticleColor(255, 0, 255)), + this.getBlockPos().getX() + 0.33 + 0.33 * this.getLevel().getRandom().nextFloat(), + + this.getBlockPos().getY() + 1.1, + this.getBlockPos().getZ() + 0.33 + 0.33 * this.getLevel().getRandom().nextFloat(), + 0.0D, 0.015D, 0.0D + + ); + } + } + } + + @Override + public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { + if (cap == ForgeCapabilities.ITEM_HANDLER) { + if (side == Direction.UP) return this.inputInventoryCapability.cast(); + if (side == Direction.DOWN) return this.outputInventoryCapability.cast(); + return this.inventoryCapability.cast(); + } + + if (cap == ForgeCapabilities.FLUID_HANDLER) return this.solventTankCapability.cast(); + + return super.getCapability(cap, side); + } + + @Override + protected void saveAdditional(CompoundTag pTag) { + super.saveAdditional(pTag); + + pTag.put("inputInventory", this.inputInventory.serializeNBT()); + pTag.put("outputInventory", this.outputInventory.serializeNBT()); + pTag.put("solventTank", this.solventTank.writeToNBT(new CompoundTag())); + + this.craftingBehaviour.saveAdditional(pTag); + } + + @Override + public void load(CompoundTag pTag) { + super.load(pTag); + + if (pTag.contains("inputInventory")) this.inputInventory.deserializeNBT(pTag.getCompound("inputInventory")); + if (pTag.contains("outputInventory")) this.outputInventory.deserializeNBT(pTag.getCompound("outputInventory")); + + if (pTag.contains("solventTank")) { + this.solventTank.readFromNBT(pTag.getCompound("solventTank")); + } + + this.craftingBehaviour.load(pTag); + } + + public class SolventTank extends FluidTank { + + public SolventTank(int capacity, Predicate validator) { + super(capacity, validator); + } + + @Override + protected void onContentsChanged() { + LiquefactionCauldronBlockEntity.this.setChanged(); + LiquefactionCauldronBlockEntity.this.sendBlockUpdated(); + } + } + + + public class InputInventory extends ItemStackHandler { + + public InputInventory() { + super(1); + } + + @Override + public void setStackInSlot(int slot, @NotNull ItemStack newStack) { + + var oldStack = this.getStackInSlot(slot); + + boolean sameItem = !newStack.isEmpty() && ItemStack.isSameItemSameTags(newStack, oldStack); + + super.setStackInSlot(slot, newStack); + + if (!sameItem) { + LiquefactionCauldronBlockEntity.this.craftingBehaviour.onInputItemChanged(oldStack, newStack); + } + + } + + @Override + public boolean isItemValid(int slot, ItemStack stack) { + return LiquefactionCauldronBlockEntity.this.craftingBehaviour.canProcess(stack) && super.isItemValid(slot, stack); + } + + @Override + protected void onContentsChanged(int slot) { + LiquefactionCauldronBlockEntity.this.setChanged(); + } + } + + public class OutputInventory extends ItemStackHandler { + + public OutputInventory() { + super(1); + } + + @Override + protected void onContentsChanged(int slot) { + LiquefactionCauldronBlockEntity.this.setChanged(); + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/liquefactioncauldron/LiquefactionCauldronCachedCheck.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/liquefactioncauldron/LiquefactionCauldronCachedCheck.java new file mode 100644 index 000000000..8d2237fd4 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/liquefactioncauldron/LiquefactionCauldronCachedCheck.java @@ -0,0 +1,77 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.liquefactioncauldron; + +import com.klikli_dev.theurgy.content.recipe.LiquefactionRecipe; +import com.klikli_dev.theurgy.content.recipe.wrapper.RecipeWrapperWithFluid; +import com.mojang.datafixers.util.Pair; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; +import org.jetbrains.annotations.Nullable; + +import java.util.Optional; + +/** + * A custom cached check + */ +class LiquefactionCauldronCachedCheck implements RecipeManager.CachedCheck { + + private final RecipeType type; + private final RecipeManager.CachedCheck internal; + @Nullable + private ResourceLocation lastRecipe; + + public LiquefactionCauldronCachedCheck(RecipeType type) { + this.type = type; + this.internal = RecipeManager.createCheck(type); + } + + private Optional> getRecipeFor(ItemStack stack, Level level, @Nullable ResourceLocation lastRecipe) { + + var recipeManager = level.getRecipeManager(); + var map = recipeManager.byType(this.type); + if (lastRecipe != null) { + var recipe = map.get(lastRecipe); + //test only the ingredient without the (separate) solvent fluid ingredient check that the recipe.matches() would. + if (recipe != null && recipe.getIngredient().test(stack)) { + return Optional.of(Pair.of(lastRecipe, recipe)); + } + } + + return map.entrySet().stream().filter((entry) -> entry.getValue().getIngredient().test(stack)).findFirst().map((entry) -> Pair.of(entry.getKey(), entry.getValue())); + } + + /** + * This only checks ingredients, not fluids + */ + public Optional getRecipeFor(ItemStack stack, Level level) { + var optional = this.getRecipeFor(stack, level, this.lastRecipe); + if (optional.isPresent()) { + var pair = optional.get(); + this.lastRecipe = pair.getFirst(); + return Optional.of(pair.getSecond()); + } else { + return Optional.empty(); + } + } + + /** + * This checks full recipe validity: ingredients + fluids + */ + @Override + public Optional getRecipeFor(RecipeWrapperWithFluid container, Level level) { + var recipe = this.internal.getRecipeFor(container, level); + if (recipe.isPresent()) { + this.lastRecipe = recipe.get().getId(); + } + + return recipe; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/liquefactioncauldron/LiquefactionCauldronCraftingBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/liquefactioncauldron/LiquefactionCauldronCraftingBehaviour.java new file mode 100644 index 000000000..f4167e20f --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/liquefactioncauldron/LiquefactionCauldronCraftingBehaviour.java @@ -0,0 +1,71 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.liquefactioncauldron; + +import com.klikli_dev.theurgy.content.behaviour.CraftingBehaviour; +import com.klikli_dev.theurgy.content.recipe.LiquefactionRecipe; +import com.klikli_dev.theurgy.content.recipe.wrapper.RecipeWrapperWithFluid; +import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.common.util.Lazy; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.ItemHandlerHelper; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Supplier; + +public class LiquefactionCauldronCraftingBehaviour extends CraftingBehaviour { + + protected Supplier solventTankSupplier; + + public LiquefactionCauldronCraftingBehaviour(BlockEntity blockEntity, Supplier inputInventorySupplier, Supplier outputInventorySupplier, Supplier solventTankSupplier) { + super(blockEntity, + Lazy.of(() -> new RecipeWrapperWithFluid(inputInventorySupplier.get(), solventTankSupplier.get())), + inputInventorySupplier, + outputInventorySupplier, + new LiquefactionCauldronCachedCheck(RecipeTypeRegistry.LIQUEFACTION.get())); + + this.solventTankSupplier = solventTankSupplier; + } + + @Override + public boolean canProcess(ItemStack stack) { + if (ItemHandlerHelper.canItemStacksStack(stack, this.inputInventorySupplier.get().getStackInSlot(0))) + return true; //early out if we are already processing this type of item + + + return this.recipeCachedCheck.getRecipeFor(stack, this.blockEntity.getLevel()).isPresent(); + } + + @Override + protected int getIngredientCount(LiquefactionRecipe recipe) { + return 1; + } + + @Override + protected int getCraftingTime(LiquefactionRecipe recipe) { + return recipe.getLiquefactionTime(); + } + + @Override + protected int getDefaultCraftingTime() { + return LiquefactionRecipe.DEFAULT_LIQUEFACTION_TIME; + } + + @Override + protected boolean craft(@Nullable LiquefactionRecipe pRecipe) { + if (!super.craft(pRecipe)) //check validity and consume item ingredients + return false; + + //then drain the solvent + this.solventTankSupplier.get().drain(pRecipe.getSolvent().getAmount(), IFluidHandler.FluidAction.EXECUTE); + + return true; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/liquefactioncauldron/render/LiquefactionCauldronRenderer.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/liquefactioncauldron/render/LiquefactionCauldronRenderer.java new file mode 100644 index 000000000..ab38c1555 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/liquefactioncauldron/render/LiquefactionCauldronRenderer.java @@ -0,0 +1,96 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.liquefactioncauldron.render; + +import com.klikli_dev.theurgy.content.apparatus.liquefactioncauldron.LiquefactionCauldronBlockEntity; +import com.klikli_dev.theurgy.content.render.RenderTypes; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; +import net.minecraft.world.inventory.InventoryMenu; +import net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions; + +public class LiquefactionCauldronRenderer implements BlockEntityRenderer { + + public LiquefactionCauldronRenderer(BlockEntityRendererProvider.Context pContext) { + } + + private static void putVertex(VertexConsumer builder, PoseStack ms, float x, float y, float z, int color, float u, + float v, Direction face, int light) { + + Vec3i normal = face.getNormal(); + PoseStack.Pose peek = ms.last(); + int a = color >> 24 & 0xff; + int r = color >> 16 & 0xff; + int g = color >> 8 & 0xff; + int b = color & 0xff; + + builder.vertex(peek.pose(), x, y, z) + .color(r, g, b, a) + .uv(u, v) + .overlayCoords(OverlayTexture.NO_OVERLAY) + .uv2(light) + .normal(peek.normal(), normal.getX(), normal.getY(), normal.getZ()) + .endVertex(); + } + + /** + * Based on com.simibubi.create.content.contraptions.fluids.tank.FluidTankR + */ + @Override + public void render(LiquefactionCauldronBlockEntity pBlockEntity, float pPartialTick, PoseStack pPoseStack, MultiBufferSource pBufferSource, int pPackedLight, int pPackedOverlay) { + if (pBlockEntity.solventTank.isEmpty()) + return; + + var fluidStack = pBlockEntity.solventTank.getFluid(); + var fluid = fluidStack.getFluid(); + var fluidType = fluid.getFluidType(); + var fluidClientExtension = IClientFluidTypeExtensions.of(fluid); + + TextureAtlasSprite fluidTexture = Minecraft.getInstance() + .getTextureAtlas(InventoryMenu.BLOCK_ATLAS) + .apply(fluidClientExtension.getStillTexture(fluidStack)); + + int color = fluidClientExtension.getTintColor(fluidStack); + int blockLightIn = (pPackedLight >> 4) & 0xF; + int luminosity = Math.max(blockLightIn, fluidType.getLightLevel(fluidStack)); + var fluidLight = (pPackedLight & 0xF00000) | luminosity << 4; + + var fluidHeight = fluidStack.getAmount() / (float) pBlockEntity.solventTank.getCapacity(); + + fluidHeight *= 0.875f; + fluidHeight += 0.25f; + + pPoseStack.pushPose(); + + var min = 0.25f; + var max = 1 - min; + + var builder = pBufferSource.getBuffer(RenderTypes.getFluid()); + + putVertex(builder, pPoseStack, min, fluidHeight, min, color, + fluidTexture.getU(2), fluidTexture.getV(2), Direction.UP, fluidLight); + + putVertex(builder, pPoseStack, min, fluidHeight, max, color, + fluidTexture.getU(14), fluidTexture.getV(2), Direction.UP, fluidLight); + + putVertex(builder, pPoseStack, max, fluidHeight, max, color, + fluidTexture.getU(14), fluidTexture.getV(14), Direction.UP, fluidLight); + + putVertex(builder, pPoseStack, max, fluidHeight, min, color, + fluidTexture.getU(2), fluidTexture.getV(14), Direction.UP, fluidLight); + + pPoseStack.popPose(); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/pyromanticbrazier/PyromanticBrazierBlock.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/pyromanticbrazier/PyromanticBrazierBlock.java new file mode 100644 index 000000000..5daed023e --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/pyromanticbrazier/PyromanticBrazierBlock.java @@ -0,0 +1,138 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.pyromanticbrazier; + +import com.klikli_dev.theurgy.registry.BlockEntityRegistry; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import net.minecraft.world.Containers; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +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.Block; +import net.minecraft.world.level.block.EntityBlock; +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 net.minecraft.world.level.block.state.StateDefinition; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.BooleanProperty; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraftforge.items.wrapper.RecipeWrapper; +import org.jetbrains.annotations.Nullable; + +public class PyromanticBrazierBlock extends Block implements EntityBlock { + + public static final BooleanProperty LIT = BlockStateProperties.LIT; + + public PyromanticBrazierBlock(Properties pProperties) { + super(pProperties); + this.registerDefaultState(this.stateDefinition.any().setValue(LIT, Boolean.FALSE)); + } + + @Override + @SuppressWarnings("deprecation") + public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { + if (pLevel.isClientSide()) { + return InteractionResult.SUCCESS; + } + + if (pLevel.getBlockEntity(pPos) instanceof PyromanticBrazierBlockEntity blockEntity) { + var inputStack = blockEntity.inventory.getStackInSlot(0); + var stackInHand = pPlayer.getItemInHand(pHand); + var brazierHasNonFuel = !inputStack.isEmpty() && blockEntity.getBurnDuration(inputStack) == 0; + + if (stackInHand.isEmpty() || brazierHasNonFuel) { + //Click with empty hand -> remove fuel from block entity + //Click with any hand but non fuel item in block entity, remove it -> clean out empty buckets etc + if (!inputStack.isEmpty()) { + pPlayer.getInventory().placeItemBackInInventory(inputStack); + blockEntity.inventory.setStackInSlot(0, ItemStack.EMPTY); + return InteractionResult.SUCCESS; + } + } else { + var remainder = blockEntity.inventory.insertItem(0, stackInHand, false); + pPlayer.setItemInHand(pHand, remainder); + if (remainder.getCount() != stackInHand.getCount()) { + return InteractionResult.SUCCESS; + } + return InteractionResult.PASS; + } + } + + return InteractionResult.PASS; + } + + @Nullable + @Override + public BlockState getStateForPlacement(BlockPlaceContext pContext) { + return super.getStateForPlacement(pContext).setValue(LIT, false); + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder pBuilder) { + pBuilder.add(LIT); + } + + @Override + public void animateTick(BlockState pState, Level pLevel, BlockPos pPos, RandomSource pRandom) { + if (pState.getValue(LIT)) { + if (pRandom.nextInt(10) == 0) { + pLevel.playLocalSound((double) pPos.getX() + 0.5D, (double) pPos.getY() + 0.5D, (double) pPos.getZ() + 0.5D, SoundEvents.CAMPFIRE_CRACKLE, SoundSource.BLOCKS, 0.5F + pRandom.nextFloat(), pRandom.nextFloat() * 0.7F + 0.6F, false); + } + + if (pRandom.nextInt(5) == 0) { + for (int i = 0; i < pRandom.nextInt(1) + 1; ++i) { + pLevel.addParticle(ParticleTypes.LAVA, (double) pPos.getX() + 0.5D, (double) pPos.getY() + 0.5D, (double) pPos.getZ() + 0.5D, pRandom.nextFloat() / 2.0F, 5.0E-5D, pRandom.nextFloat() / 2.0F); + } + } + } + + } + + @Override + @SuppressWarnings("deprecation") + public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { + if (!pState.is(pNewState.getBlock())) { + if (pLevel.getBlockEntity(pPos) instanceof PyromanticBrazierBlockEntity blockEntity) { + Containers.dropContents(pLevel, pPos, new RecipeWrapper(blockEntity.inventory)); + } + } + super.onRemove(pState, pLevel, pPos, pNewState, pIsMoving); + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pPos, BlockState pState) { + return BlockEntityRegistry.PYROMANTIC_BRAZIER.get().create(pPos, pState); + } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level pLevel, BlockState pState, BlockEntityType pBlockEntityType) { + if (pLevel.isClientSide()) { + return pState.getValue(LIT) ? + (lvl, pos, blockState, t) -> { + if (t instanceof PyromanticBrazierBlockEntity blockEntity) { + blockEntity.tickClient(); + } + } : null; + } + return (lvl, pos, blockState, t) -> { + if (t instanceof PyromanticBrazierBlockEntity blockEntity) { + blockEntity.tickServer(); + } + }; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/pyromanticbrazier/PyromanticBrazierBlockEntity.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/pyromanticbrazier/PyromanticBrazierBlockEntity.java new file mode 100644 index 000000000..548d6134a --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/pyromanticbrazier/PyromanticBrazierBlockEntity.java @@ -0,0 +1,155 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.pyromanticbrazier; + +import com.klikli_dev.theurgy.content.apparatus.calcinationoven.CalcinationOvenBlock; +import com.klikli_dev.theurgy.content.capability.HeatProvider; +import com.klikli_dev.theurgy.registry.BlockEntityRegistry; +import com.klikli_dev.theurgy.registry.CapabilityRegistry; +import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemStackHandler; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class PyromanticBrazierBlockEntity extends BlockEntity { + public ItemStackHandler inventory; + + public LazyOptional inventoryCapability; + public LazyOptional heatProviderCapability; + + private int remainingLitTime; + + public PyromanticBrazierBlockEntity(BlockPos pPos, BlockState pBlockState) { + super(BlockEntityRegistry.PYROMANTIC_BRAZIER.get(), pPos, pBlockState); + + this.inventory = new Inventory(); + this.inventoryCapability = LazyOptional.of(() -> this.inventory); + + this.heatProviderCapability = LazyOptional.of(() -> () -> this.getBlockState().getValue(PyromanticBrazierBlock.LIT)); + } + + protected int getBurnDuration(ItemStack pFuel) { + if (pFuel.isEmpty()) { + return 0; + } else { + return ForgeHooks.getBurnTime(pFuel, RecipeTypeRegistry.PYROMANTIC_BRAZIER.get()); + } + } + + public boolean isLit() { + return this.remainingLitTime > 0; + } + + public void tickClient() { +// RandomSource randomsource = this.level.random; +// if (randomsource.nextFloat() < 0.11F) { +// for (int i = 0; i < randomsource.nextInt(2) + 2; ++i) { +// CampfireBlock.makeParticles(this.level, this.getBlockPos(), false, false); +// } +// } + } + + public void tickServer() { + boolean wasTurnedOnDuringThisTick = false; + boolean wasLitAtBeginOfTick = this.isLit(); + if (wasLitAtBeginOfTick) { + --this.remainingLitTime; + } + + var fuelStack = this.inventory.getStackInSlot(0); + boolean hasFuel = !fuelStack.isEmpty(); + + //light the block / turn it on if we have fuel + if (!this.isLit() && hasFuel) { + this.remainingLitTime = this.getBurnDuration(fuelStack); + + if (this.isLit()) { + wasTurnedOnDuringThisTick = true; + //handle lava bucket + if (fuelStack.hasCraftingRemainingItem()) + this.inventory.setStackInSlot(0, fuelStack.getCraftingRemainingItem()); + //handle all other fuel items + else if (hasFuel) { + fuelStack.shrink(1); + if (fuelStack.isEmpty()) { + this.inventory.setStackInSlot(0, fuelStack.getCraftingRemainingItem()); + } + } + } + } + + + if (wasLitAtBeginOfTick != this.isLit()) { + wasTurnedOnDuringThisTick = true; + var newState = this.getBlockState().setValue(CalcinationOvenBlock.LIT, this.isLit()); + this.level.setBlock(this.getBlockPos(), newState, 3); + } + + if (wasTurnedOnDuringThisTick) { + this.setChanged(); + } + } + + @Override + public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { + if (cap == ForgeCapabilities.ITEM_HANDLER) { + return this.inventoryCapability.cast(); + } + + if (cap == CapabilityRegistry.HEAT_PROVIDER) { + return this.heatProviderCapability.cast(); + } + + return super.getCapability(cap, side); + } + + @Override + protected void saveAdditional(CompoundTag pTag) { + super.saveAdditional(pTag); + + pTag.put("inventory", this.inventory.serializeNBT()); + pTag.putShort("remainingLitTime", (short) this.remainingLitTime); + } + + @Override + public void load(CompoundTag pTag) { + super.load(pTag); + + if (pTag.contains("inventory")) + this.inventory.deserializeNBT(pTag.getCompound("inventory")); + + if (pTag.contains("remainingLitTime")) + this.remainingLitTime = pTag.getShort("remainingLitTime"); + } + + private class Inventory extends ItemStackHandler { + public Inventory() { + super(1); + } + + @Override + public boolean isItemValid(int slot, @NotNull ItemStack stack) { + return PyromanticBrazierBlockEntity.this.getBurnDuration(stack) > 0; + } + + @Override + protected void onContentsChanged(int slot) { + PyromanticBrazierBlockEntity.this.setChanged(); + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniacaccumulator/SalAmmoniacAccumulatorBlock.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniacaccumulator/SalAmmoniacAccumulatorBlock.java new file mode 100644 index 000000000..3dc18d42e --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniacaccumulator/SalAmmoniacAccumulatorBlock.java @@ -0,0 +1,105 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.salammoniacaccumulator; + +import com.klikli_dev.theurgy.content.behaviour.FluidHandlerBehaviour; +import com.klikli_dev.theurgy.content.behaviour.ItemHandlerBehaviour; +import com.klikli_dev.theurgy.content.behaviour.OneSlotItemHandlerBehaviour; +import com.klikli_dev.theurgy.content.behaviour.OneTankFluidHandlerBehaviour; +import com.klikli_dev.theurgy.registry.BlockEntityRegistry; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.Containers; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelAccessor; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.EntityBlock; +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 net.minecraft.world.phys.BlockHitResult; +import net.minecraftforge.items.wrapper.RecipeWrapper; +import org.jetbrains.annotations.Nullable; + +public class SalAmmoniacAccumulatorBlock extends Block implements EntityBlock { + protected ItemHandlerBehaviour itemHandlerBehaviour; + protected FluidHandlerBehaviour fluidHandlerBehaviour; + + public SalAmmoniacAccumulatorBlock(Properties pProperties) { + super(pProperties); + this.itemHandlerBehaviour = new OneSlotItemHandlerBehaviour(); + this.fluidHandlerBehaviour = new OneTankFluidHandlerBehaviour(); + } + + @Override + @SuppressWarnings("deprecation") + public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { + if (pLevel.isClientSide()) { + return InteractionResult.SUCCESS; + } + + if (this.fluidHandlerBehaviour.useFluidHandler(pState, pLevel, pPos, pPlayer, pHand, pHit) == InteractionResult.SUCCESS) { + return InteractionResult.SUCCESS; + } + + if (this.itemHandlerBehaviour.useItemHandler(pState, pLevel, pPos, pPlayer, pHand, pHit) == InteractionResult.SUCCESS) { + return InteractionResult.SUCCESS; + } + + return InteractionResult.PASS; + } + + @Override + @SuppressWarnings("deprecation") + public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { + if (!pState.is(pNewState.getBlock())) { + if (pLevel.getBlockEntity(pPos) instanceof SalAmmoniacAccumulatorBlockEntity blockEntity) { + Containers.dropContents(pLevel, pPos, new RecipeWrapper(blockEntity.inventory)); + } + } + super.onRemove(pState, pLevel, pPos, pNewState, pIsMoving); + } + + @Override + @SuppressWarnings("deprecation") + public BlockState updateShape(BlockState pState, Direction pFacing, BlockState pFacingState, LevelAccessor pLevel, BlockPos pCurrentPos, BlockPos pFacingPos) { + + if (pLevel.getBlockEntity(pCurrentPos) instanceof SalAmmoniacAccumulatorBlockEntity accumulatorBlockEntity && pFacing == Direction.DOWN) { + accumulatorBlockEntity.validateOutputTank(); + } + + return super.updateShape(pState, pFacing, pFacingState, pLevel, pCurrentPos, pFacingPos); + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pPos, BlockState pState) { + return BlockEntityRegistry.SAL_AMMONIAC_ACCUMULATOR.get().create(pPos, pState); + } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level pLevel, BlockState pState, BlockEntityType pBlockEntityType) { + + if (pLevel.isClientSide()) { + return (lvl, pos, blockState, t) -> { + if (t instanceof SalAmmoniacAccumulatorBlockEntity blockEntity) { + blockEntity.tickClient(); + } + }; + } + return (lvl, pos, blockState, t) -> { + if (t instanceof SalAmmoniacAccumulatorBlockEntity blockEntity) { + blockEntity.tickServer(); + } + }; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniacaccumulator/SalAmmoniacAccumulatorBlockEntity.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniacaccumulator/SalAmmoniacAccumulatorBlockEntity.java new file mode 100644 index 000000000..0e8bb3e11 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniacaccumulator/SalAmmoniacAccumulatorBlockEntity.java @@ -0,0 +1,257 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.salammoniacaccumulator; + +import com.klikli_dev.theurgy.content.particle.ParticleColor; +import com.klikli_dev.theurgy.content.particle.coloredbubble.ColoredBubbleParticleProvider; +import com.klikli_dev.theurgy.registry.BlockEntityRegistry; +import com.klikli_dev.theurgy.registry.ItemTagRegistry; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.Connection; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidType; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.templates.FluidTank; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemStackHandler; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Predicate; + +public class SalAmmoniacAccumulatorBlockEntity extends BlockEntity { + + public ItemStackHandler inventory; + public LazyOptional inventoryCapability; + + public FluidTank waterTank; + public LazyOptional waterTankCapability; + + protected SalAmmoniacAccumulatorCraftingBehaviour craftingBehaviour; + + private boolean checkOutputTankOnNextQuery; + private boolean hasOutputTank; + + public SalAmmoniacAccumulatorBlockEntity(BlockPos pPos, BlockState pState) { + super(BlockEntityRegistry.SAL_AMMONIAC_ACCUMULATOR.get(), pPos, pState); + + this.inventory = new Inventory(); + this.inventoryCapability = LazyOptional.of(() -> this.inventory); + + this.craftingBehaviour = new SalAmmoniacAccumulatorCraftingBehaviour(this, () -> this.inventory, () -> this.inventory, () -> this.waterTank, () -> this.getOutputTank()); + + this.waterTank = new WaterTank(FluidType.BUCKET_VOLUME * 10, this.craftingBehaviour::canProcess); + this.waterTankCapability = LazyOptional.of(() -> this.waterTank); + + this.checkOutputTankOnNextQuery = true; + } + + @Override + public CompoundTag getUpdateTag() { + var tag = new CompoundTag(); + this.writeNetwork(tag); + return tag; + } + + @Override + public void handleUpdateTag(CompoundTag tag) { + this.readNetwork(tag); + } + + @Nullable + @Override + public Packet getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this); + } + + @Override + public void onDataPacket(Connection connection, ClientboundBlockEntityDataPacket packet) { + var tag = packet.getTag(); + if (tag != null) { + this.readNetwork(tag); + } + } + + public void readNetwork(CompoundTag tag) { + if (tag.contains("waterTank")) { + this.waterTank.readFromNBT(tag.getCompound("waterTank")); + } + + if (tag.contains("inventory")) { + this.inventory.deserializeNBT(tag.getCompound("inventory")); + } + + this.craftingBehaviour.readNetwork(tag); + } + + public void writeNetwork(CompoundTag tag) { + tag.put("waterTank", this.waterTank.writeToNBT(new CompoundTag())); + tag.put("inventory", this.inventory.serializeNBT()); + + this.craftingBehaviour.writeNetwork(tag); + } + + public void sendBlockUpdated() { + if (this.level != null && !this.level.isClientSide) + this.level.sendBlockUpdated(this.getBlockPos(), this.getBlockState(), this.getBlockState(), Block.UPDATE_CLIENTS); + } + + public void tickServer() { + if (!this.hasOutputTank()) { + return; + } + + boolean hasInput = !this.waterTank.isEmpty(); + + this.craftingBehaviour.tickServer(true, hasInput); //does not need heat + } + + public void tickClient() { + var isProcessing = this.craftingBehaviour.isProcessing(); + if (isProcessing) { + if (this.getLevel().getGameTime() % 2 == 0) { // only spawn particles every 2 ticks + + var fluidStack = this.waterTank.getFluid(); + var fluidClientExtension = IClientFluidTypeExtensions.of(fluidStack.getFluid()); + int waterColor = fluidClientExtension.getTintColor(fluidStack); + + var particleColor = this.inventory.getStackInSlot(0).is(ItemTagRegistry.SAL_AMMONIAC_GEMS) ? + new ParticleColor(255, 192, 128) : ParticleColor.fromInt(waterColor); + + var fluidHeight = fluidStack.getAmount() / (float) this.waterTank.getCapacity(); + + //move fluid plane between bottom and top of the model + fluidHeight += 0.5f; + fluidHeight *= 0.60f; + + this.getLevel().addParticle( + ColoredBubbleParticleProvider.createOptions(particleColor), + this.getBlockPos().getX() + 0.33 + 0.33 * this.getLevel().getRandom().nextFloat(), + + this.getBlockPos().getY() + fluidHeight, + this.getBlockPos().getZ() + 0.33 + 0.33 * this.getLevel().getRandom().nextFloat(), + 0.0D, 0.015D, 0.0D + + ); + } + } + } + + public IFluidHandler getOutputTank() { + var below = this.getBlockPos().below(); + var blockEntity = this.level.getBlockEntity(below); + return blockEntity.getCapability(ForgeCapabilities.FLUID_HANDLER).orElseThrow(() -> new IllegalStateException("No fluid handler capability found on block entity below at location: " + below)); + } + + public void validateOutputTank() { + var below = this.getBlockPos().below(); + var blockEntity = this.level.getBlockEntity(below); + this.hasOutputTank = blockEntity != null && blockEntity.getCapability(ForgeCapabilities.FLUID_HANDLER).isPresent(); + } + + public boolean hasOutputTank() { + if (this.checkOutputTankOnNextQuery) { + this.checkOutputTankOnNextQuery = false; + this.validateOutputTank(); + } + return this.hasOutputTank; + } + + @Override + public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { + if (cap == ForgeCapabilities.ITEM_HANDLER) { + return this.inventoryCapability.cast(); + } + + if (cap == ForgeCapabilities.FLUID_HANDLER) return this.waterTankCapability.cast(); + + return super.getCapability(cap, side); + } + + @Override + protected void saveAdditional(CompoundTag pTag) { + super.saveAdditional(pTag); + + pTag.put("inventory", this.inventory.serializeNBT()); + pTag.put("waterTank", this.waterTank.writeToNBT(new CompoundTag())); + + this.craftingBehaviour.saveAdditional(pTag); + } + + @Override + public void load(CompoundTag pTag) { + super.load(pTag); + + if (pTag.contains("inventory")) this.inventory.deserializeNBT(pTag.getCompound("inventory")); + + if (pTag.contains("waterTank")) { + this.waterTank.readFromNBT(pTag.getCompound("waterTank")); + } + + this.craftingBehaviour.load(pTag); + } + + public class WaterTank extends FluidTank { + + public WaterTank(int capacity, Predicate validator) { + super(capacity, validator); + } + + @Override + protected void onContentsChanged() { + SalAmmoniacAccumulatorBlockEntity.this.setChanged(); + SalAmmoniacAccumulatorBlockEntity.this.sendBlockUpdated(); + } + } + + + public class Inventory extends ItemStackHandler { + + public Inventory() { + super(1); + } + + @Override + public void setStackInSlot(int slot, @NotNull ItemStack newStack) { + + var oldStack = this.getStackInSlot(slot); + + boolean sameItem = !newStack.isEmpty() && ItemStack.isSameItemSameTags(newStack, oldStack); + + super.setStackInSlot(slot, newStack); + + if (!sameItem) { + SalAmmoniacAccumulatorBlockEntity.this.craftingBehaviour.onInputItemChanged(oldStack, newStack); + } + } + + @Override + public boolean isItemValid(int slot, ItemStack stack) { + return SalAmmoniacAccumulatorBlockEntity.this.craftingBehaviour.canProcess(stack) && super.isItemValid(slot, stack); + } + + @Override + protected void onContentsChanged(int slot) { + SalAmmoniacAccumulatorBlockEntity.this.setChanged(); + SalAmmoniacAccumulatorBlockEntity.this.sendBlockUpdated(); + } + } + +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniacaccumulator/SalAmmoniacAccumulatorCachedCheck.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniacaccumulator/SalAmmoniacAccumulatorCachedCheck.java new file mode 100644 index 000000000..b81702da7 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniacaccumulator/SalAmmoniacAccumulatorCachedCheck.java @@ -0,0 +1,107 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.salammoniacaccumulator; + +import com.klikli_dev.theurgy.content.recipe.AccumulationRecipe; +import com.klikli_dev.theurgy.content.recipe.wrapper.RecipeWrapperWithFluid; +import com.mojang.datafixers.util.Pair; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; +import net.minecraftforge.fluids.FluidStack; +import org.jetbrains.annotations.Nullable; + +import java.util.Optional; + +/** + * A custom cached check + */ +class SalAmmoniacAccumulatorCachedCheck implements RecipeManager.CachedCheck { + + private final RecipeType type; + private final RecipeManager.CachedCheck internal; + @Nullable + private ResourceLocation lastRecipe; + + public SalAmmoniacAccumulatorCachedCheck(RecipeType type) { + this.type = type; + this.internal = RecipeManager.createCheck(type); + } + + private Optional> getRecipeFor(ItemStack stack, Level level, @Nullable ResourceLocation lastRecipe) { + + var recipeManager = level.getRecipeManager(); + var map = recipeManager.byType(this.type); + if (lastRecipe != null) { + var recipe = map.get(lastRecipe); + //test only the ingredient without the (separate) evaporate fluid ingredient check that the recipe.matches() would. + if (recipe != null && recipe.hasSolute() && recipe.getSolute().test(stack)) { + return Optional.of(Pair.of(lastRecipe, recipe)); + } + } + + return map.entrySet().stream().filter((entry) -> entry.getValue().hasSolute() && entry.getValue().getSolute().test(stack)).findFirst().map((entry) -> Pair.of(entry.getKey(), entry.getValue())); + } + + private Optional> getRecipeFor(FluidStack stack, Level level, @Nullable ResourceLocation lastRecipe) { + + var recipeManager = level.getRecipeManager(); + var map = recipeManager.byType(this.type); + if (lastRecipe != null) { + var recipe = map.get(lastRecipe); + //test only the fluid without the (separate) solute item ingredient check that the recipe.matches() would. + if (recipe != null && recipe.getEvaporant().test(stack)) { + return Optional.of(Pair.of(lastRecipe, recipe)); + } + } + + return map.entrySet().stream().filter((entry) -> entry.getValue().getEvaporant().test(stack)).findFirst().map((entry) -> Pair.of(entry.getKey(), entry.getValue())); + } + + /** + * This only checks ingredients, not fluids + */ + public Optional getRecipeFor(ItemStack stack, Level level) { + var optional = this.getRecipeFor(stack, level, this.lastRecipe); + if (optional.isPresent()) { + var pair = optional.get(); + this.lastRecipe = pair.getFirst(); + return Optional.of(pair.getSecond()); + } else { + return Optional.empty(); + } + } + + /** + * This only checks fluids, not ingredients + */ + public Optional getRecipeFor(FluidStack stack, Level level) { + var optional = this.getRecipeFor(stack, level, this.lastRecipe); + if (optional.isPresent()) { + var pair = optional.get(); + this.lastRecipe = pair.getFirst(); + return Optional.of(pair.getSecond()); + } else { + return Optional.empty(); + } + } + + /** + * This checks full recipe validity: ingredients + fluids + */ + @Override + public Optional getRecipeFor(RecipeWrapperWithFluid container, Level level) { + var recipe = this.internal.getRecipeFor(container, level); + if (recipe.isPresent()) { + this.lastRecipe = recipe.get().getId(); + } + + return recipe; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniacaccumulator/SalAmmoniacAccumulatorCraftingBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniacaccumulator/SalAmmoniacAccumulatorCraftingBehaviour.java new file mode 100644 index 000000000..ff1ecbbb6 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniacaccumulator/SalAmmoniacAccumulatorCraftingBehaviour.java @@ -0,0 +1,112 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.salammoniacaccumulator; + +import com.klikli_dev.theurgy.content.behaviour.CraftingBehaviour; +import com.klikli_dev.theurgy.content.recipe.AccumulationRecipe; +import com.klikli_dev.theurgy.content.recipe.wrapper.RecipeWrapperWithFluid; +import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.common.util.Lazy; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.ItemHandlerHelper; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Supplier; + +public class SalAmmoniacAccumulatorCraftingBehaviour extends CraftingBehaviour { + + protected Supplier waterTankSupplier; + protected Supplier outputTankSupplier; + + public SalAmmoniacAccumulatorCraftingBehaviour(BlockEntity blockEntity, Supplier inputInventorySupplier, Supplier outputInventorySupplier, Supplier waterTankSupplier, Supplier outputTankSupplier) { + super(blockEntity, + Lazy.of(() -> new RecipeWrapperWithFluid(inputInventorySupplier.get(), waterTankSupplier.get())), + inputInventorySupplier, + outputInventorySupplier, + new SalAmmoniacAccumulatorCachedCheck(RecipeTypeRegistry.ACCUMULATION.get())); + + this.waterTankSupplier = waterTankSupplier; + this.outputTankSupplier = outputTankSupplier; + } + + @Override + public boolean canProcess(ItemStack stack) { + if (ItemHandlerHelper.canItemStacksStack(stack, this.inputInventorySupplier.get().getStackInSlot(0))) + return true; //early out if we are already processing this type of item + + + return this.recipeCachedCheck.getRecipeFor(stack, this.blockEntity.getLevel()).isPresent(); + } + + + public boolean canProcess(FluidStack stack) { + if (this.waterTankSupplier.get().getFluidInTank(0).isFluidEqual(stack)) + return true; //early out if we are already processing this type of fluid + + //now we use our custom cached check that checks only liquids: + return this.recipeCachedCheck.getRecipeFor(stack, this.blockEntity.getLevel()).isPresent(); + } + + @Override + protected int getIngredientCount(AccumulationRecipe recipe) { + return 1; + } + + @Override + protected int getCraftingTime(AccumulationRecipe recipe) { + return recipe.getAccumulationTime(); + } + + @Override + protected int getDefaultCraftingTime() { + return AccumulationRecipe.DEFAULT_ACCUMULATION_TIME; + } + + @Override + protected boolean canCraft(@Nullable AccumulationRecipe pRecipe) { + if (pRecipe == null) return false; + + var assembledStack = pRecipe.assembleFluid(this.recipeWrapperSupplier.get(), this.blockEntity.getLevel().registryAccess()); + if (assembledStack.isEmpty()) { + return false; + } else { + var tank = this.outputTankSupplier.get(); + int fluidAccepted = tank.fill(assembledStack, IFluidHandler.FluidAction.SIMULATE); + + //initially we only allowed if we had space for the entire fluid + //however this leads to a bug: if we first run on water and get a partially full tank, + //and then add a sal ammoniac crystal that wants to add a full bucket -> stops running. + //considering the low value of crystals it is OK to discard a partial fluid stack here. + //return fluidAccepted == assembledStack.getAmount(); + return fluidAccepted > 0; + } + } + + @Override + protected boolean craft(@Nullable AccumulationRecipe pRecipe) { + if (!this.canCraft(pRecipe)) return false; + + var assembledFluid = pRecipe.assembleFluid(this.recipeWrapperSupplier.get(), this.blockEntity.getLevel().registryAccess()); + var outputFluidTank = this.outputTankSupplier.get(); + + outputFluidTank.fill(assembledFluid, IFluidHandler.FluidAction.EXECUTE); + + //only consume the solid solute, if the recipe requires it. + //this avoids accidentally consuming a solute when a "water only" recipe is running while the solute is added. + if (pRecipe.hasSolute()) { + this.inputInventorySupplier.get().extractItem(0, this.getIngredientCount(pRecipe), false); + } + + this.waterTankSupplier.get().drain(pRecipe.getEvaporant().getAmount(), IFluidHandler.FluidAction.EXECUTE); + + return true; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniacaccumulator/render/SalAmmoniacAccumulatorRenderer.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniacaccumulator/render/SalAmmoniacAccumulatorRenderer.java new file mode 100644 index 000000000..7b03f2720 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniacaccumulator/render/SalAmmoniacAccumulatorRenderer.java @@ -0,0 +1,102 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.salammoniacaccumulator.render; + +import com.klikli_dev.theurgy.content.apparatus.salammoniacaccumulator.SalAmmoniacAccumulatorBlockEntity; +import com.klikli_dev.theurgy.content.render.RenderTypes; +import com.klikli_dev.theurgy.registry.ItemTagRegistry; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; +import net.minecraft.world.inventory.InventoryMenu; +import net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions; + +public class SalAmmoniacAccumulatorRenderer implements BlockEntityRenderer { + + public SalAmmoniacAccumulatorRenderer(BlockEntityRendererProvider.Context pContext) { + } + + private static void putVertex(VertexConsumer builder, PoseStack ms, float x, float y, float z, int color, float u, + float v, Direction face, int light) { + + Vec3i normal = face.getNormal(); + PoseStack.Pose peek = ms.last(); + int a = color >> 24 & 0xff; + int r = color >> 16 & 0xff; + int g = color >> 8 & 0xff; + int b = color & 0xff; + + builder.vertex(peek.pose(), x, y, z) + .color(r, g, b, a) + .uv(u, v) + .overlayCoords(OverlayTexture.NO_OVERLAY) + .uv2(light) + .normal(peek.normal(), normal.getX(), normal.getY(), normal.getZ()) + .endVertex(); + } + + @Override + /** + * Based on com.simibubi.create.content.contraptions.fluids.tank.FluidTankR + */ + public void render(SalAmmoniacAccumulatorBlockEntity pBlockEntity, float pPartialTick, PoseStack pPoseStack, MultiBufferSource pBufferSource, int pPackedLight, int pPackedOverlay) { + if (pBlockEntity.waterTank.isEmpty()) + return; + + var fluidStack = pBlockEntity.waterTank.getFluid(); + var fluid = fluidStack.getFluid(); + var fluidType = fluid.getFluidType(); + var fluidClientExtension = IClientFluidTypeExtensions.of(fluid); + + TextureAtlasSprite fluidTexture = Minecraft.getInstance() + .getTextureAtlas(InventoryMenu.BLOCK_ATLAS) + .apply(fluidClientExtension.getStillTexture(fluidStack)); + + int color = fluidClientExtension.getTintColor(fluidStack); + + if (pBlockEntity.inventory.getStackInSlot(0).is(ItemTagRegistry.SAL_AMMONIAC_GEMS)) + color = 0xFFC080FF; + + int blockLightIn = (pPackedLight >> 4) & 0xF; + int luminosity = Math.max(blockLightIn, fluidType.getLightLevel(fluidStack)); + var fluidLight = (pPackedLight & 0xF00000) | luminosity << 4; + + var fluidHeight = fluidStack.getAmount() / (float) pBlockEntity.waterTank.getCapacity(); + + //move fluid plane between bottom and top of the model + fluidHeight += 0.5f; + fluidHeight *= 0.60f; + + pPoseStack.pushPose(); + + var min = 0.25f; + var max = 1 - min; + + var builder = pBufferSource.getBuffer(RenderTypes.getFluid()); + + putVertex(builder, pPoseStack, min, fluidHeight, min, color, + fluidTexture.getU(2), fluidTexture.getV(2), Direction.UP, fluidLight); + + putVertex(builder, pPoseStack, min, fluidHeight, max, color, + fluidTexture.getU(14), fluidTexture.getV(2), Direction.UP, fluidLight); + + putVertex(builder, pPoseStack, max, fluidHeight, max, color, + fluidTexture.getU(14), fluidTexture.getV(14), Direction.UP, fluidLight); + + putVertex(builder, pPoseStack, max, fluidHeight, min, color, + fluidTexture.getU(2), fluidTexture.getV(14), Direction.UP, fluidLight); + + pPoseStack.popPose(); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniactank/SalAmmoniacTankBlock.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniactank/SalAmmoniacTankBlock.java new file mode 100644 index 000000000..47c067964 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniactank/SalAmmoniacTankBlock.java @@ -0,0 +1,71 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.salammoniactank; + +import com.klikli_dev.theurgy.content.behaviour.FluidHandlerBehaviour; +import com.klikli_dev.theurgy.content.behaviour.OneTankFluidHandlerBehaviour; +import com.klikli_dev.theurgy.registry.BlockEntityRegistry; +import net.minecraft.core.BlockPos; +import net.minecraft.world.InteractionHand; +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.EntityBlock; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import org.jetbrains.annotations.Nullable; + +public class SalAmmoniacTankBlock extends Block implements EntityBlock { + + protected FluidHandlerBehaviour fluidHandlerBehaviour; + + public SalAmmoniacTankBlock(Properties pProperties) { + super(pProperties); + this.fluidHandlerBehaviour = new OneTankFluidHandlerBehaviour(); + } + + @Override + @SuppressWarnings("deprecation") + public RenderShape getRenderShape(BlockState pState) { + //Why model for the top? because then we get the particle texture from destroying it. + return RenderShape.ENTITYBLOCK_ANIMATED; + } + + @Override + @SuppressWarnings("deprecation") + public InteractionResult use(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { + if (pLevel.isClientSide()) { + return InteractionResult.SUCCESS; + } + + if (this.fluidHandlerBehaviour.useFluidHandler(pState, pLevel, pPos, pPlayer, pHand, pHit) == InteractionResult.SUCCESS) { + return InteractionResult.SUCCESS; + } + + return InteractionResult.PASS; + } + + @Override + @SuppressWarnings("deprecation") + public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState pNewState, boolean pIsMoving) { + if (!pState.is(pNewState.getBlock())) { + if (pLevel.getBlockEntity(pPos) instanceof SalAmmoniacTankBlockEntity blockEntity) { + //no inventory + } + } + super.onRemove(pState, pLevel, pPos, pNewState, pIsMoving); + } + + @Nullable + @Override + public BlockEntity newBlockEntity(BlockPos pPos, BlockState pState) { + return BlockEntityRegistry.SAL_AMMONIAC_TANK.get().create(pPos, pState); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniactank/SalAmmoniacTankBlockEntity.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniactank/SalAmmoniacTankBlockEntity.java new file mode 100644 index 000000000..9f01fa005 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniactank/SalAmmoniacTankBlockEntity.java @@ -0,0 +1,137 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.salammoniactank; + +import com.klikli_dev.theurgy.registry.BlockEntityRegistry; +import com.klikli_dev.theurgy.registry.FluidTagRegistry; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.Connection; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.util.LazyOptional; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidType; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.templates.FluidTank; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import software.bernie.geckolib.animatable.GeoBlockEntity; +import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.function.Predicate; + +public class SalAmmoniacTankBlockEntity extends BlockEntity implements GeoBlockEntity { + + protected final AnimatableInstanceCache animatableInstanceCache = GeckoLibUtil.createInstanceCache(this); + + public FluidTank tank; + public LazyOptional tankCapability; + + public SalAmmoniacTankBlockEntity(BlockPos pPos, BlockState pBlockState) { + super(BlockEntityRegistry.SAL_AMMONIAC_TANK.get(), pPos, pBlockState); + + this.tank = new Tank(FluidType.BUCKET_VOLUME, (fluidStack -> ForgeRegistries.FLUIDS.tags().getTag(FluidTagRegistry.SAL_AMMONIAC).contains(fluidStack.getFluid()))); + this.tankCapability = LazyOptional.of(() -> this.tank); + } + + @Override + public CompoundTag getUpdateTag() { + var tag = new CompoundTag(); + this.writeNetwork(tag); + return tag; + } + + @Override + public void handleUpdateTag(CompoundTag tag) { + this.readNetwork(tag); + } + + @Nullable + @Override + public Packet getUpdatePacket() { + return ClientboundBlockEntityDataPacket.create(this); + } + + @Override + public void onDataPacket(Connection connection, ClientboundBlockEntityDataPacket packet) { + var tag = packet.getTag(); + if (tag != null) { + this.readNetwork(tag); + } + } + + public void readNetwork(CompoundTag tag) { + if (tag.contains("tank")) { + this.tank.readFromNBT(tag.getCompound("tank")); + } + } + + public void writeNetwork(CompoundTag tag) { + tag.put("tank", this.tank.writeToNBT(new CompoundTag())); + } + + public void sendBlockUpdated() { + if (this.level != null && !this.level.isClientSide) + this.level.sendBlockUpdated(this.getBlockPos(), this.getBlockState(), this.getBlockState(), Block.UPDATE_CLIENTS); + } + + public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { + + if (cap == ForgeCapabilities.FLUID_HANDLER) return this.tankCapability.cast(); + + return super.getCapability(cap, side); + } + + @Override + protected void saveAdditional(CompoundTag pTag) { + super.saveAdditional(pTag); + pTag.put("tank", this.tank.writeToNBT(new CompoundTag())); + } + + @Override + public void load(CompoundTag pTag) { + super.load(pTag); + + if (pTag.contains("tank")) { + this.tank.readFromNBT(pTag.getCompound("tank")); + } + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.animatableInstanceCache; + } + + public class Tank extends FluidTank { + + public Tank(int capacity, Predicate validator) { + super(capacity, validator); + } + + @Override + protected void onContentsChanged() { + SalAmmoniacTankBlockEntity.this.setChanged(); + SalAmmoniacTankBlockEntity.this.sendBlockUpdated(); + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniactank/SalAmmoniacTankBlockItem.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniactank/SalAmmoniacTankBlockItem.java new file mode 100644 index 000000000..6883f8ff1 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniactank/SalAmmoniacTankBlockItem.java @@ -0,0 +1,49 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.salammoniactank; + +import com.klikli_dev.theurgy.content.apparatus.salammoniactank.render.SalAmmoniacTankBEWLR; +import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import software.bernie.geckolib.animatable.GeoItem; +import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.core.animation.AnimatableManager; +import software.bernie.geckolib.util.GeckoLibUtil; + +import java.util.function.Consumer; + +public class SalAmmoniacTankBlockItem extends BlockItem implements GeoItem { + + private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); + + public SalAmmoniacTankBlockItem(Block pBlock, Properties pProperties) { + super(pBlock, pProperties); + } + + + @Override + public void initializeClient(Consumer consumer) { + consumer.accept(new IClientItemExtensions() { + @Override + public BlockEntityWithoutLevelRenderer getCustomRenderer() { + return SalAmmoniacTankBEWLR.get(); + } + }); + } + + @Override + public void registerControllers(AnimatableManager.ControllerRegistrar controllerRegistrar) { + //do not show anims on item + } + + @Override + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.cache; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniactank/render/SalAmmoniacTankBEWLR.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniactank/render/SalAmmoniacTankBEWLR.java new file mode 100644 index 000000000..7ad1d8e37 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniactank/render/SalAmmoniacTankBEWLR.java @@ -0,0 +1,54 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.salammoniactank.render; + +import com.klikli_dev.theurgy.content.apparatus.salammoniactank.SalAmmoniacTankBlockItem; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.block.model.ItemTransform; +import net.minecraft.world.item.ItemDisplayContext; +import org.joml.Matrix4f; +import org.joml.Vector3f; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoItemRenderer; + +public class SalAmmoniacTankBEWLR extends GeoItemRenderer { + + private static final SalAmmoniacTankBEWLR instance = new SalAmmoniacTankBEWLR(); + private final ItemTransform transform; + + public SalAmmoniacTankBEWLR() { + super(new SalAmmoniacTankModel()); + this.withScale(0.5f); + this.transform = new ItemTransform(new Vector3f(30, 255, 0), new Vector3f(0, 0, 0), new Vector3f(1, 1, 1)); + } + + public static SalAmmoniacTankBEWLR get() { + return instance; + } + + @Override + public void preRender(PoseStack poseStack, SalAmmoniacTankBlockItem animatable, BakedGeoModel model, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int packedLight, int packedOverlay, float red, float green, float blue, + float alpha) { + //copied from parent, but fixed to also center the model when scaling + this.itemRenderTranslations = new Matrix4f(poseStack.last().pose()); + + if (this.scaleWidth != 1 && this.scaleHeight != 1) { + poseStack.scale(this.scaleWidth, this.scaleHeight, this.scaleWidth); + + //this is not as clean as I would like it - but it exactly centers the model for 0.5 scale :D + poseStack.translate(this.scaleWidth / 0.5 - 0.5, -0.1, this.scaleWidth / 0.5 - 0.5); + } + + poseStack.translate(0.5f, 0.51f, 0.5f); + + if (this.renderPerspective == ItemDisplayContext.GUI) { + this.transform.apply(false, poseStack); + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniactank/render/SalAmmoniacTankModel.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniactank/render/SalAmmoniacTankModel.java new file mode 100644 index 000000000..e3fab6efd --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniactank/render/SalAmmoniacTankModel.java @@ -0,0 +1,29 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.salammoniactank.render; + +import com.klikli_dev.theurgy.Theurgy; +import net.minecraft.resources.ResourceLocation; +import software.bernie.geckolib.core.animatable.GeoAnimatable; +import software.bernie.geckolib.model.GeoModel; + +public class SalAmmoniacTankModel extends GeoModel { + @Override + public ResourceLocation getModelResource(GeoAnimatable animatable) { + return Theurgy.loc("geo/sal_ammoniac_tank.geo.json"); + } + + @Override + public ResourceLocation getTextureResource(GeoAnimatable animatable) { + return Theurgy.loc("textures/block/sal_ammoniac_tank.png"); + } + + @Override + public ResourceLocation getAnimationResource(GeoAnimatable animatable) { + return Theurgy.loc(""); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniactank/render/SalAmmoniacTankRenderer.java b/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniactank/render/SalAmmoniacTankRenderer.java new file mode 100644 index 000000000..68ef4ba65 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/apparatus/salammoniactank/render/SalAmmoniacTankRenderer.java @@ -0,0 +1,64 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.apparatus.salammoniactank.render; + +import com.klikli_dev.theurgy.content.apparatus.salammoniactank.SalAmmoniacTankBlockEntity; +import com.klikli_dev.theurgy.content.render.FluidRenderer; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.util.Mth; +import software.bernie.geckolib.cache.object.BakedGeoModel; +import software.bernie.geckolib.renderer.GeoBlockRenderer; + +public class SalAmmoniacTankRenderer extends GeoBlockRenderer { + public SalAmmoniacTankRenderer(BlockEntityRendererProvider.Context pContext) { + super(new SalAmmoniacTankModel()); + } + + /** + * See com.simibubi.create.content.fluids.tank.FluidTankRenderer + */ + @Override + public void actuallyRender(PoseStack poseStack, SalAmmoniacTankBlockEntity pBlockEntity, BakedGeoModel model, RenderType renderType, MultiBufferSource bufferSource, VertexConsumer buffer, boolean isReRender, float partialTick, int pPackedLight, int packedOverlay, float red, float green, float blue, float alpha) { + super.actuallyRender(poseStack, pBlockEntity, model, renderType, bufferSource, buffer, isReRender, partialTick, pPackedLight, packedOverlay, red, green, blue, alpha); + + if (pBlockEntity.tank.isEmpty()) + return; + + var fluidStack = pBlockEntity.tank.getFluid(); + + var fluidHeight = fluidStack.getAmount() / (float) pBlockEntity.tank.getCapacity(); + + float blockHeight = 15 / 16f; + float blockWidth = 1; + float capHeight = 1 / 4f; + float tankHullWidth = 2 / 16f + 1 / 128f; + float minPuddleHeight = 1 / 16f; + float totalHeight = blockHeight - 2 * capHeight - minPuddleHeight; + + float level = fluidHeight; +// if (level < 1 / (512f * totalHeight)) //leads to not rendering in fill levels below 10/1000 or so. +// return; + float clampedLevel = Mth.clamp(level * totalHeight, 0, totalHeight); + + float xMin = tankHullWidth; + float xMax = xMin + blockWidth - 2 * tankHullWidth; + float yMin = totalHeight + capHeight + minPuddleHeight - clampedLevel; + float yMax = yMin + clampedLevel; + + float zMin = tankHullWidth; + float zMax = zMin + blockWidth - 2 * tankHullWidth; + + poseStack.pushPose(); + poseStack.translate(0, clampedLevel - totalHeight, 0); + FluidRenderer.renderFluidBox(fluidStack, xMin, yMin, zMin, xMax, yMax, zMax, bufferSource, poseStack, pPackedLight, false); + poseStack.popPose(); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/behaviour/AnimationBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/behaviour/AnimationBehaviour.java new file mode 100644 index 000000000..59be002d3 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/behaviour/AnimationBehaviour.java @@ -0,0 +1,33 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.behaviour; + +import net.minecraft.world.level.block.entity.BlockEntity; +import software.bernie.geckolib.animatable.GeoBlockEntity; +import software.bernie.geckolib.core.animatable.instance.AnimatableInstanceCache; +import software.bernie.geckolib.core.animation.AnimationState; +import software.bernie.geckolib.core.object.PlayState; +import software.bernie.geckolib.util.GeckoLibUtil; + +public abstract class AnimationBehaviour { + + protected final AnimatableInstanceCache animatableInstanceCache; + protected T blockEntity; + protected boolean wasProcessingLastTick; + + public AnimationBehaviour(T blockEntity) { + this.blockEntity = blockEntity; + this.animatableInstanceCache = GeckoLibUtil.createInstanceCache(blockEntity); + } + + public AnimatableInstanceCache getAnimatableInstanceCache() { + return this.animatableInstanceCache; + } + + public abstract PlayState animationHandler(AnimationState event); + +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/behaviour/CraftingBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/behaviour/CraftingBehaviour.java new file mode 100644 index 000000000..964964e9c --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/behaviour/CraftingBehaviour.java @@ -0,0 +1,181 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.behaviour; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeManager; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.ItemHandlerHelper; +import net.minecraftforge.items.wrapper.RecipeWrapper; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Supplier; + +public abstract class CraftingBehaviour, C extends RecipeManager.CachedCheck> { + protected BlockEntity blockEntity; + protected Supplier recipeWrapperSupplier; + protected Supplier inputInventorySupplier; + protected Supplier outputInventorySupplier; + protected C recipeCachedCheck; + + protected int progress; + protected int totalTime; + protected boolean isProcessing; + + + public CraftingBehaviour(BlockEntity blockEntity, Supplier recipeWrapper, Supplier inputInventorySupplier, Supplier outputInventorySupplier, C recipeCachedCheck) { + this.blockEntity = blockEntity; + this.recipeWrapperSupplier = recipeWrapper; + this.inputInventorySupplier = inputInventorySupplier; + this.outputInventorySupplier = outputInventorySupplier; + this.recipeCachedCheck = recipeCachedCheck; + } + + public boolean isProcessing() { + return this.isProcessing; + } + + public void readNetwork(CompoundTag tag) { + this.isProcessing = tag.getBoolean("isProcessing"); + } + + public void writeNetwork(CompoundTag tag) { + tag.putBoolean("isProcessing", this.isProcessing); + } + + public void saveAdditional(CompoundTag pTag) { + pTag.putShort("progress", (short) this.progress); + } + + public void load(CompoundTag pTag) { + if (pTag.contains("progress")) + this.progress = pTag.getShort("progress"); + } + + /** + * Advances the crafting process by one tick. + * + * @param canProcess indicates if "fuel" is available (energy, or usually: heat). If false, will stop processing and reset progress. + * @param hasInput indicates if input ingredients are available. If false, will stop processing and reset progress. + */ + public void tickServer(boolean canProcess, boolean hasInput) { + if (hasInput) { + //only even check for recipe if we have input to avoid unnecessary lookups + var recipe = this.recipeCachedCheck.getRecipeFor(this.recipeWrapperSupplier.get(), this.blockEntity.getLevel()).orElse(null); + + //if we are lit and have a recipe, update progress + if (canProcess && this.canCraft(recipe)) { + this.tryStartProcessing(); + + this.progress++; + + this.tryFinishProcessing(recipe); + } else { + this.stopProcessing(); + } + } else { + this.stopProcessing(); + } + } + + public void onInputItemChanged(ItemStack oldStack, ItemStack newStack) { + this.totalTime = this.getTotalTime(); + this.progress = 0; + } + + public abstract boolean canProcess(ItemStack stack); + + /** + * If progress has reached 100%, craft the item and reset progress. + */ + protected void tryFinishProcessing(R pRecipe) { + if (this.progress >= this.totalTime) { + this.progress = 0; + this.totalTime = this.getTotalTime(); + + this.craft(pRecipe); + this.sendBlockUpdated(); + //no need to setChanged() as the BE does that on inventory change. + } + } + + protected void tryStartProcessing() { + if (this.progress == 0) { + this.isProcessing = true; + this.sendBlockUpdated(); + //no need to setChanged() as the BE does that on inventory change. + } + + //we don't have to worry about total time here, as it is set when an item is put into the inventory. + } + + protected void stopProcessing() { + //only do state updates if we actually changed something + if (this.progress != 0 || this.isProcessing) { + this.isProcessing = false; + this.progress = 0; + this.sendBlockUpdated(); + //no need to setChanged() as the BE does that on inventory change. + } + + //we don't have to worry about total time here, as it is set when an item is put into the inventory. + } + + protected boolean canCraft(@Nullable R pRecipe) { + if (pRecipe == null) + return false; + + var assembledStack = pRecipe.assemble(this.recipeWrapperSupplier.get(), this.blockEntity.getLevel().registryAccess()); + if (assembledStack.isEmpty()) { + return false; + } else { + var remainingStack = ItemHandlerHelper.insertItemStacked(this.outputInventorySupplier.get(), assembledStack, true); + return remainingStack.isEmpty(); //only allow crafting if we have room for the full output + } + } + + protected boolean craft(@Nullable R pRecipe) { + if (!this.canCraft(pRecipe)) + return false; + + var assembledStack = pRecipe.assemble(this.recipeWrapperSupplier.get(), this.blockEntity.getLevel().registryAccess()); + + // Safely insert the assembledStack into the outputInventory and update the input stack. + ItemHandlerHelper.insertItemStacked(this.outputInventorySupplier.get(), assembledStack, false); + this.inputInventorySupplier.get().extractItem(0, this.getIngredientCount(pRecipe), false); + + return true; + } + + + protected int getTotalTime() { + return this.recipeCachedCheck.getRecipeFor(this.recipeWrapperSupplier.get(), this.blockEntity.getLevel()) + .map(this::getCraftingTime) + .orElse(this.getDefaultCraftingTime()); + } + + protected void sendBlockUpdated() { + if (this.blockEntity.getLevel() != null && !this.blockEntity.getLevel().isClientSide) + this.blockEntity.getLevel().sendBlockUpdated( + this.blockEntity.getBlockPos(), + this.blockEntity.getBlockState(), + this.blockEntity.getBlockState(), + Block.UPDATE_CLIENTS + ); + } + + protected abstract int getIngredientCount(R recipe); + + protected abstract int getCraftingTime(R recipe); + + protected abstract int getDefaultCraftingTime(); + +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/behaviour/FluidHandlerBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/behaviour/FluidHandlerBehaviour.java new file mode 100644 index 000000000..ac423047a --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/behaviour/FluidHandlerBehaviour.java @@ -0,0 +1,20 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.behaviour; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +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.BlockHitResult; + +public interface FluidHandlerBehaviour { + + InteractionResult useFluidHandler(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit); +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/behaviour/HeatedBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/behaviour/HeatedBehaviour.java new file mode 100644 index 000000000..ccf41e347 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/behaviour/HeatedBehaviour.java @@ -0,0 +1,50 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.behaviour; + +import com.klikli_dev.theurgy.registry.CapabilityRegistry; +import net.minecraft.core.Direction; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; + +public class HeatedBehaviour { + + private final BlockEntity blockEntity; + int CHECK_HEAT_TICK_INTERVAL = 20; + private boolean heatedCache; + + public HeatedBehaviour(BlockEntity blockEntity) { + this.blockEntity = blockEntity; + } + + boolean hasHeatProvider() { + var below = this.blockEntity.getLevel().getBlockEntity(this.blockEntity.getBlockPos().below()); + if (below == null) { + return false; + } + + return below.getCapability(CapabilityRegistry.HEAT_PROVIDER, Direction.UP).map(provider -> provider.isHot()).orElse(false); + } + + public boolean isHeated() { + if (this.blockEntity.getLevel().getGameTime() % this.CHECK_HEAT_TICK_INTERVAL == 0) { + var wasHeated = this.heatedCache; + + var isHeated = this.hasHeatProvider(); + this.heatedCache = isHeated; + + if (wasHeated != isHeated) { + if (this.blockEntity.getBlockState().hasProperty(BlockStateProperties.LIT)) { + var newState = this.blockEntity.getBlockState().setValue(BlockStateProperties.LIT, isHeated); + this.blockEntity.getLevel().setBlock(this.blockEntity.getBlockPos(), newState, 1 | 2); + } + this.blockEntity.setChanged(); + } + } + return this.heatedCache; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/behaviour/ItemHandlerBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/behaviour/ItemHandlerBehaviour.java new file mode 100644 index 000000000..b8634ff8b --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/behaviour/ItemHandlerBehaviour.java @@ -0,0 +1,20 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.behaviour; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +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.BlockHitResult; + +public interface ItemHandlerBehaviour { + + InteractionResult useItemHandler(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit); +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/behaviour/OneSlotItemHandlerBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/behaviour/OneSlotItemHandlerBehaviour.java new file mode 100644 index 000000000..d059534a3 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/behaviour/OneSlotItemHandlerBehaviour.java @@ -0,0 +1,60 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.behaviour; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraftforge.common.capabilities.ForgeCapabilities; + +public class OneSlotItemHandlerBehaviour implements ItemHandlerBehaviour { + + public static final int SLOT = 0; + + + /** + * Default interaction for blocks that have a block entity with an in/output inventory with one slot. + */ + @Override + public InteractionResult useItemHandler(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { + var blockEntity = pLevel.getBlockEntity(pPos); + + if (blockEntity == null) + return InteractionResult.PASS; + + var blockItemHandlerCap = blockEntity.getCapability(ForgeCapabilities.ITEM_HANDLER); + if (!blockItemHandlerCap.isPresent()) + return InteractionResult.PASS; + + var blockItemHandler = blockItemHandlerCap.orElse(null); + + ItemStack stackInHand = pPlayer.getItemInHand(pHand); + + if (stackInHand.isEmpty()) { + //with empty hand, try to take out + var extracted = blockItemHandler.extractItem(SLOT, blockItemHandler.getSlotLimit(SLOT), false); + if (!extracted.isEmpty()) { + pPlayer.getInventory().placeItemBackInInventory(extracted); + return InteractionResult.SUCCESS; + } + } else { + //if we have an item in hand, try to insert + var remainder = blockItemHandler.insertItem(SLOT, stackInHand, false); + pPlayer.setItemInHand(pHand, remainder); + if (remainder.getCount() != stackInHand.getCount()) { + return InteractionResult.SUCCESS; + } + } + + return InteractionResult.PASS; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/behaviour/OneTankFluidHandlerBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/behaviour/OneTankFluidHandlerBehaviour.java new file mode 100644 index 000000000..55b930949 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/behaviour/OneTankFluidHandlerBehaviour.java @@ -0,0 +1,77 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.behaviour; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidUtil; +import net.minecraftforge.fluids.capability.IFluidHandlerItem; + +public class OneTankFluidHandlerBehaviour implements FluidHandlerBehaviour { + + /** + * Default interaction for blocks have a block entity with a fluid handler. + */ + @Override + public InteractionResult useFluidHandler(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { + var blockEntity = pLevel.getBlockEntity(pPos); + + if (blockEntity == null) + return InteractionResult.PASS; + + var stackInHand = pPlayer.getItemInHand(pHand); + var fillStack = stackInHand.copyWithCount(1); //necessary to handle stacks of containers, because FluidUtil only can handle one item at a time + + var blockFluidHandlerCap = blockEntity.getCapability(ForgeCapabilities.FLUID_HANDLER); + var itemFluidHandlerCap = FluidUtil.getFluidHandler(fillStack); + + if (!blockFluidHandlerCap.isPresent() || !itemFluidHandlerCap.isPresent()) + return InteractionResult.PASS; + + var blockFluidHandler = blockFluidHandlerCap.orElse(null); + var itemFluidHandler = itemFluidHandlerCap.orElse(null); + + //first we try to insert + var transferredFluid = FluidUtil.tryFluidTransfer(blockFluidHandler, itemFluidHandler, + Integer.MAX_VALUE, true); + if (this.updateFluidContainerInHand(pPlayer, pHand, stackInHand, itemFluidHandler, transferredFluid)) + return InteractionResult.SUCCESS; + + //if that fails, try to extract + transferredFluid = FluidUtil.tryFluidTransfer(itemFluidHandler, blockFluidHandler, + Integer.MAX_VALUE, true); + if (this.updateFluidContainerInHand(pPlayer, pHand, stackInHand, itemFluidHandler, transferredFluid)) + return InteractionResult.SUCCESS; + + + return InteractionResult.PASS; + } + + private boolean updateFluidContainerInHand(Player pPlayer, InteractionHand pHand, ItemStack stackInHand, IFluidHandlerItem itemFluidHandler, FluidStack transferredFluid) { + if (!transferredFluid.isEmpty()) { + //handle bucket stacking correctly + stackInHand.shrink(1); + if (stackInHand.isEmpty()) { + pPlayer.setItemInHand(pHand, itemFluidHandler.getContainer()); //always set to container to handle e.g. empty bucket correctly + } else { + pPlayer.setItemInHand(pHand, stackInHand); + pPlayer.getInventory().placeItemBackInInventory(itemFluidHandler.getContainer()); + } + + return true; + } + return false; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/behaviour/PreventInsertWrapper.java b/src/main/java/com/klikli_dev/theurgy/content/behaviour/PreventInsertWrapper.java new file mode 100644 index 000000000..ce16f816b --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/behaviour/PreventInsertWrapper.java @@ -0,0 +1,64 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.behaviour; + +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.items.IItemHandlerModifiable; +import org.jetbrains.annotations.NotNull; + +/** + * Wrapper for IItemHandlerModifiable that prevents insertion of items. + */ +public class PreventInsertWrapper implements IItemHandlerModifiable { + protected final IItemHandlerModifiable compose; + + public PreventInsertWrapper(IItemHandlerModifiable compose) { + this.compose = compose; + } + + @Override + public int getSlots() { + return this.compose.getSlots(); + } + + @Override + @NotNull + public ItemStack getStackInSlot(int slot) { + return this.compose.getStackInSlot(slot); + } + + @Override + @NotNull + public ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) { + if (!this.isItemValid(slot, stack)) + return stack; + + return this.compose.insertItem(slot, stack, simulate); + } + + @Override + @NotNull + public ItemStack extractItem(int slot, int amount, boolean simulate) { + return this.compose.extractItem(slot, amount, simulate); + } + + @Override + public void setStackInSlot(int slot, @NotNull ItemStack stack) { + this.compose.setStackInSlot(slot, stack); + } + + @Override + public int getSlotLimit(int slot) { + return this.compose.getSlotLimit(slot); + } + + @Override + public boolean isItemValid(int slot, @NotNull ItemStack stack) { + return false; + } + +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/behaviour/TwoSlotItemHandlerBehaviour.java b/src/main/java/com/klikli_dev/theurgy/content/behaviour/TwoSlotItemHandlerBehaviour.java new file mode 100644 index 000000000..ffeb9c33f --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/behaviour/TwoSlotItemHandlerBehaviour.java @@ -0,0 +1,67 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.behaviour; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraftforge.common.capabilities.ForgeCapabilities; + +public class TwoSlotItemHandlerBehaviour implements ItemHandlerBehaviour { + + public static final int INPUT_SLOT = 0; + public static final int OUTPUT_SLOT = 1; + + /** + * Default interaction for blocks that have a block entity with an input and an output inventory with one slot each, made available as combined inventory with input on slot 0 and output on slot 1. + */ + @Override + public InteractionResult useItemHandler(BlockState pState, Level pLevel, BlockPos pPos, Player pPlayer, InteractionHand pHand, BlockHitResult pHit) { + var blockEntity = pLevel.getBlockEntity(pPos); + + if (blockEntity == null) + return InteractionResult.PASS; + + var blockItemHandlerCap = blockEntity.getCapability(ForgeCapabilities.ITEM_HANDLER); + if (!blockItemHandlerCap.isPresent()) + return InteractionResult.PASS; + + var blockItemHandler = blockItemHandlerCap.orElse(null); + + ItemStack stackInHand = pPlayer.getItemInHand(pHand); + + if (stackInHand.isEmpty()) { + //with empty hand first try take output + var extracted = blockItemHandler.extractItem(OUTPUT_SLOT, blockItemHandler.getSlotLimit(OUTPUT_SLOT), false); + if (!extracted.isEmpty()) { + pPlayer.getInventory().placeItemBackInInventory(extracted); + return InteractionResult.SUCCESS; + } + + //if no output, try take input + extracted = blockItemHandler.extractItem(INPUT_SLOT, blockItemHandler.getSlotLimit(INPUT_SLOT), false); + if (!extracted.isEmpty()) { + pPlayer.getInventory().placeItemBackInInventory(extracted); + return InteractionResult.SUCCESS; + } + } else { + //if we have an item in hand, try to insert + var remainder = blockItemHandler.insertItem(INPUT_SLOT, stackInHand, false); + pPlayer.setItemInHand(pHand, remainder); + if (remainder.getCount() != stackInHand.getCount()) { + return InteractionResult.SUCCESS; + } + } + + return InteractionResult.PASS; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/capability/DefaultHeatProvider.java b/src/main/java/com/klikli_dev/theurgy/content/capability/DefaultHeatProvider.java new file mode 100644 index 000000000..d961a6eec --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/capability/DefaultHeatProvider.java @@ -0,0 +1,36 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.capability; + +import net.minecraft.nbt.ByteTag; +import net.minecraft.nbt.Tag; +import net.minecraftforge.common.util.INBTSerializable; + +public class DefaultHeatProvider implements HeatProvider, INBTSerializable { + protected boolean isHot; + + @Override + public boolean isHot() { + return this.isHot; + } + + public void setHot(boolean isHot) { + this.isHot = isHot; + } + + @Override + public Tag serializeNBT() { + return ByteTag.valueOf(this.isHot ? (byte) 1 : 0); + } + + @Override + public void deserializeNBT(Tag nbt) { + if (!(nbt instanceof ByteTag byteNbt)) + throw new IllegalArgumentException("Can not deserialize to an instance that isn't the default implementation"); + this.isHot = byteNbt.getAsByte() != 0; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/capability/HeatProvider.java b/src/main/java/com/klikli_dev/theurgy/content/capability/HeatProvider.java new file mode 100644 index 000000000..e08567cc1 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/capability/HeatProvider.java @@ -0,0 +1,11 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.capability; + +public interface HeatProvider { + boolean isHot(); +} diff --git a/src/main/java/com/klikli_dev/theurgy/entity/ColoredProjectile.java b/src/main/java/com/klikli_dev/theurgy/content/entity/ColoredProjectile.java similarity index 92% rename from src/main/java/com/klikli_dev/theurgy/entity/ColoredProjectile.java rename to src/main/java/com/klikli_dev/theurgy/content/entity/ColoredProjectile.java index b4356a807..71b05d3dd 100644 --- a/src/main/java/com/klikli_dev/theurgy/entity/ColoredProjectile.java +++ b/src/main/java/com/klikli_dev/theurgy/content/entity/ColoredProjectile.java @@ -1,12 +1,12 @@ /* - * SPDX-FileCopyrightText: 2022 the original author or authors of Ars Noveau https://github.com/baileyholl/Ars-Nouveau + * SPDX-FileCopyrightText: 2023 klikli-dev * - * SPDX-License-Identifier: LGPL-3.0-only + * SPDX-License-Identifier: MIT */ -package com.klikli_dev.theurgy.entity; +package com.klikli_dev.theurgy.content.entity; -import com.klikli_dev.theurgy.client.particle.ParticleColor; +import com.klikli_dev.theurgy.content.particle.ParticleColor; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; diff --git a/src/main/java/com/klikli_dev/theurgy/entity/FollowProjectile.java b/src/main/java/com/klikli_dev/theurgy/content/entity/FollowProjectile.java similarity index 94% rename from src/main/java/com/klikli_dev/theurgy/entity/FollowProjectile.java rename to src/main/java/com/klikli_dev/theurgy/content/entity/FollowProjectile.java index 590992744..c7fc30203 100644 --- a/src/main/java/com/klikli_dev/theurgy/entity/FollowProjectile.java +++ b/src/main/java/com/klikli_dev/theurgy/content/entity/FollowProjectile.java @@ -1,13 +1,13 @@ /* - * SPDX-FileCopyrightText: 2022 klikli-dev + * SPDX-FileCopyrightText: 2023 klikli-dev * * SPDX-License-Identifier: MIT */ -package com.klikli_dev.theurgy.entity; +package com.klikli_dev.theurgy.content.entity; -import com.klikli_dev.theurgy.client.particle.GlowParticleData; -import com.klikli_dev.theurgy.client.particle.ParticleColor; +import com.klikli_dev.theurgy.content.particle.ParticleColor; +import com.klikli_dev.theurgy.content.particle.glow.GlowParticleProvider; import com.klikli_dev.theurgy.registry.EntityDataSerializerRegistry; import com.klikli_dev.theurgy.registry.EntityRegistry; import com.klikli_dev.theurgy.registry.ParticleRegistry; @@ -23,7 +23,6 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; -import net.minecraftforge.network.NetworkHooks; import net.minecraftforge.network.PlayMessages; public class FollowProjectile extends ColoredProjectile { @@ -155,7 +154,7 @@ public void tick() { float dist = (float) (Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ) * 8.0f); for (double i = 0.0; i <= dist; i++) { double coeff = (i / dist); - this.level().addParticle(GlowParticleData.createData(new ParticleColor(this.entityData.get(RED), this.entityData.get(GREEN), this.entityData.get(BLUE)), 0.25f, 0.75f, particleAge), + this.level().addParticle(GlowParticleProvider.createOptions(new ParticleColor(this.entityData.get(RED), this.entityData.get(GREEN), this.entityData.get(BLUE)), 0.25f, 0.75f, particleAge), (this.getX() + deltaX * coeff), (this.getY() + deltaY * coeff), (this.getZ() + deltaZ * coeff), 0.0125f * (this.random.nextFloat() - 0.5f), 0.0125f * (this.random.nextFloat() - 0.5f), 0.0125f * (this.random.nextFloat() - 0.5f)); diff --git a/src/main/java/com/klikli_dev/theurgy/content/fluid/SolventFluidType.java b/src/main/java/com/klikli_dev/theurgy/content/fluid/SolventFluidType.java new file mode 100644 index 000000000..dc174b1fb --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/fluid/SolventFluidType.java @@ -0,0 +1,58 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.fluid; + +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions; +import net.minecraftforge.fluids.FluidType; + +import java.util.function.Consumer; + +public class SolventFluidType extends FluidType { + private final ResourceLocation still; + private final ResourceLocation flowing; + private final ResourceLocation overlay; + private final int tint; + + /** + * Default constructor. + * + * @param properties the general properties of the fluid type + */ + public SolventFluidType(Properties properties, ResourceLocation still, ResourceLocation flowing, ResourceLocation overlay, int tint) { + super(properties); + this.still = still; + this.flowing = flowing; + this.overlay = overlay; + this.tint = tint; + } + + @Override + public void initializeClient(Consumer consumer) { + consumer.accept(new IClientFluidTypeExtensions() { + @Override + public ResourceLocation getStillTexture() { + return SolventFluidType.this.still; + } + + @Override + public ResourceLocation getFlowingTexture() { + return SolventFluidType.this.flowing; + } + + @Override + public ResourceLocation getOverlayTexture() { + return SolventFluidType.this.overlay; + } + + @Override + public int getTintColor() { + return SolventFluidType.this.tint; + } + }); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/gui/GuiTextures.java b/src/main/java/com/klikli_dev/theurgy/content/gui/GuiTextures.java new file mode 100644 index 000000000..543aaf333 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/gui/GuiTextures.java @@ -0,0 +1,61 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.gui; + +import com.klikli_dev.theurgy.Theurgy; +import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.resources.ResourceLocation; + +/** + * Based on com.simibubi.create.foundation.gui.AllGuiTextures from Create + */ +public enum GuiTextures { + JEI_INPUT_SLOT("jei/recipe_gui", 0, 0, 18, 18), + JEI_OUTPUT_SLOT("jei/recipe_gui", 18, 0, 26, 26), + + JEI_FIRE_EMPTY("jei/recipe_gui", 0, 42, 14, 14), + JEI_FIRE_FULL("jei/recipe_gui", 14, 42, 14, 14), + JEI_ARROW_RIGHT_EMPTY("jei/recipe_gui", 0, 26, 22, 16), + JEI_ARROW_RIGHT_FULL("jei/recipe_gui", 22, 26, 22, 16), + + MODONOMICON_ARROW_RIGHT(new ResourceLocation("modonomicon", "textures/gui/crafting_textures.png"), 71, 205, 9, 9, 128, 256), + MODONOMICON_SLOT(new ResourceLocation("modonomicon", "textures/gui/crafting_textures.png"), 84, 198, 22, 22, 128, 256); + + public final ResourceLocation location; + public final int textureHeight; + public final int textureWidth; + public final int width; + public final int height; + public final int x; + public final int y; + + GuiTextures(String name, int width, int height) { + this(name, 0, 0, width, height); + } + + GuiTextures(String name, int x, int y, int width, int height) { + this(Theurgy.loc("textures/gui/" + name + ".png"), x, y, width, height, 256, 256); + } + + GuiTextures(ResourceLocation location, int x, int y, int width, int height, int textureWidth, int textureHeight) { + this.location = location; + this.textureWidth = textureWidth; + this.textureHeight = textureHeight; + this.width = width; + this.height = height; + this.x = x; + this.y = y; + } + + public void render(GuiGraphics guiGraphics, int x, int y) { + RenderSystem.enableBlend(); + //seems tex width and height are switched here, but that is just a misnomer in the mapping. + //I think pre 1.19.4 it was actually switched, but now when providing the size corresponding to the mapping name it is distorted - so we switch it back. + guiGraphics.blit(this.location, x, y, 0, this.x, this.y, this.width, this.height, this.textureWidth, this.textureHeight); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/item/AlchemicalSaltItem.java b/src/main/java/com/klikli_dev/theurgy/content/item/AlchemicalSaltItem.java new file mode 100644 index 000000000..154d154ba --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/item/AlchemicalSaltItem.java @@ -0,0 +1,51 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.item; + +import com.google.common.collect.ImmutableList; +import com.klikli_dev.theurgy.TheurgyConstants; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.ComponentUtils; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; + +import java.util.List; + +public class AlchemicalSaltItem extends Item { + public AlchemicalSaltItem(Properties pProperties) { + super(pProperties); + } + + public static List getTooltipData(ItemStack saltItem) { + if (saltItem.getItem() instanceof AlchemicalSaltItem salt) { + return ImmutableList.of(salt.getSourceName(saltItem)); + } + + return ImmutableList.of(); + } + + public static MutableComponent formatSourceName(MutableComponent sourceName) { + return sourceName.withStyle(Style.EMPTY + .withColor(ChatFormatting.GREEN) + .withItalic(true) + ); + } + + public MutableComponent getSourceName(ItemStack pStack) { + return formatSourceName(Component.translatable(pStack.getDescriptionId() + TheurgyConstants.I18n.Item.ALCHEMICAL_SALT_SOURCE_SUFFIX)); + } + + @Override + public Component getName(ItemStack pStack) { + return Component.translatable(this.getDescriptionId(pStack), ComponentUtils.wrapInSquareBrackets( + this.getSourceName(pStack) + )); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/item/AlchemicalSulfurItem.java b/src/main/java/com/klikli_dev/theurgy/content/item/AlchemicalSulfurItem.java new file mode 100644 index 000000000..42c6c29f7 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/item/AlchemicalSulfurItem.java @@ -0,0 +1,228 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.item; + +import com.google.common.collect.ImmutableList; +import com.klikli_dev.theurgy.TheurgyConstants; +import com.klikli_dev.theurgy.content.item.render.AlchemicalSulfurBEWLR; +import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; +import com.klikli_dev.theurgy.util.LevelUtil; +import com.klikli_dev.theurgy.util.TagUtil; +import net.minecraft.ChatFormatting; +import net.minecraft.Util; +import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.ComponentUtils; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.client.extensions.common.IClientItemExtensions; +import net.minecraftforge.registries.ForgeRegistries; + +import java.util.List; +import java.util.function.Consumer; + +public class AlchemicalSulfurItem extends Item { + /** + * if true, an item model based on builtin/entity will be generated for this item. + * This will cause SulfurBEWLR to be used to render the item dynamically based on TheurgyConstants.Nbt.SULFUR_SOURCE_ID, instead of a json model. + *

+ * Note: this variable cannot be used to conditionally register an IClientItemExtensions, + * because the registration happens in the Item constructor, before this variable is set. + * However, it is also not necessary, because the render behaviour is governed by the item model anyway. + */ + public boolean useAutomaticIconRendering; + /** + * if true, will use TheurgyConstants.Nbt.SULFUR_SOURCE_ID to provide a parameter to the item name component that can be accessed with %s in the language file. + */ + public boolean useAutomaticNameRendering; + /** + * if true, will use TheurgyConstants.Nbt.SULFUR_SOURCE_ID to provide a parameter to the item tooltip component that can be accessed with %s in the language file. + */ + public boolean provideAutomaticTooltipData; + + /** + * If true will convert the tag to a description id and use it as source name, instead of the source stack procured for the tag. + * This is mainly intended for sulfurs that actually represent a tag (such as "all logs"). + * It should not be used for sulfurs that represent a specific item where we use the tag to handle mod compat (e.g. "Tingleberry"). + */ + public boolean overrideTagSourceName; + + /** + * If true will use the source name from the lang file, instead of the source stack. + * Additionally, this will cause overrideTagSourceName to be ignored. + */ + public boolean overrideSourceName; + + /** + * If true the LiquefactionRecipe used to craft this item will automatically generate a source id based on the ingredient, if no source id is provided in the recipe result nbt. + */ + public boolean autoGenerateSourceIdInRecipe; + + public AlchemicalSulfurItem(Properties pProperties) { + super(pProperties); + this.useAutomaticIconRendering = true; + this.useAutomaticNameRendering = true; + this.provideAutomaticTooltipData = true; + this.autoGenerateSourceIdInRecipe = true; + this.overrideTagSourceName = false; + this.overrideSourceName = false; + } + + public static String getSourceItemId(ItemStack sulfurStack) { + if (!sulfurStack.hasTag()) { + var level = LevelUtil.getLevelWithoutContext(); + var recipeManager = level == null ? null : level.getRecipeManager(); + var registryAccess = level == null ? null : level.registryAccess(); + + if (recipeManager != null) { + var liquefactionRecipes = recipeManager.getAllRecipesFor(RecipeTypeRegistry.LIQUEFACTION.get()).stream().filter(r -> r.getResultItem(registryAccess) != null).toList(); + + var sulfurWithNbt = liquefactionRecipes.stream() + .filter(recipe -> recipe.getResultItem(registryAccess) != null && recipe.getResultItem(registryAccess).getItem() == sulfurStack.getItem()).findFirst().map(recipe -> recipe.getResultItem(registryAccess)); + + if (sulfurWithNbt.isPresent() && sulfurWithNbt.get().hasTag()) { + sulfurStack.setTag(sulfurWithNbt.get().getTag()); + } + } + } + + if (sulfurStack.hasTag() && sulfurStack.getTag().contains(TheurgyConstants.Nbt.SULFUR_SOURCE_ID)) { + return sulfurStack.getTag().getString(TheurgyConstants.Nbt.SULFUR_SOURCE_ID); + } + + return ""; + } + + /** + * Get the source item stack from the sulfur stack nbt. + * The source *should* be the item that was used to create the sulfur. + * Due to this only being used for automatic rendering and naming purposes, the source might be a different item for some reason, and in many cases could be empty. + */ + public static ItemStack getSourceStack(ItemStack sulfurStack) { + var itemSourceId = getSourceItemId(sulfurStack); //we call this first, because it might find the source for us + + //but then we do our normal checks + if (sulfurStack.hasTag() && sulfurStack.getTag().contains(TheurgyConstants.Nbt.SULFUR_SOURCE_ID)) { + ItemStack sourceStack; + + if (itemSourceId.startsWith("#")) { + var tagId = new ResourceLocation(itemSourceId.substring(1)); + var tag = TagKey.create(Registries.ITEM, tagId); + sourceStack = TagUtil.getItemStackForTag(tag); + } else { + var itemId = new ResourceLocation(itemSourceId); + sourceStack = new ItemStack(ForgeRegistries.ITEMS.getValue(itemId)); + } + + if (sulfurStack.getTag().contains(TheurgyConstants.Nbt.SULFUR_SOURCE_NBT)) + sourceStack.setTag(sulfurStack.getTag().getCompound(TheurgyConstants.Nbt.SULFUR_SOURCE_NBT)); + return sourceStack; + } + + return ItemStack.EMPTY; + } + + public static List getTooltipData(ItemStack sulfurStack) { + if (sulfurStack.getItem() instanceof AlchemicalSulfurItem sulfur && sulfur.provideAutomaticTooltipData) { + return ImmutableList.of(sulfur.getSourceName(sulfurStack)); + } + + return ImmutableList.of(); + } + + public static MutableComponent formatSourceName(MutableComponent sourceName) { + return sourceName.withStyle(Style.EMPTY + .withColor(ChatFormatting.GREEN) + .withItalic(true) + ); + } + + public AlchemicalSulfurItem noAuto() { + this.useAutomaticIconRendering = false; + this.useAutomaticNameRendering = false; + this.provideAutomaticTooltipData = false; + this.overrideTagSourceName = false; + return this; + } + + public AlchemicalSulfurItem autoIcon(boolean value) { + this.useAutomaticIconRendering = value; + return this; + } + + public AlchemicalSulfurItem autoName(boolean value) { + this.useAutomaticNameRendering = value; + return this; + } + + public AlchemicalSulfurItem autoTooltip(boolean value) { + this.provideAutomaticTooltipData = value; + return this; + } + + public AlchemicalSulfurItem overrideTagSourceName(boolean value) { + this.overrideTagSourceName = value; + return this; + } + + public AlchemicalSulfurItem overrideSourceName(boolean value) { + this.overrideSourceName = value; + this.autoGenerateSourceIdInRecipe = !value; + return this; + } + + public AlchemicalSulfurItem autoGenerateSourceIdInRecipe(boolean value) { + this.autoGenerateSourceIdInRecipe = value; + return this; + } + + public MutableComponent getSourceName(ItemStack pStack) { + if (this.overrideSourceName) { + return formatSourceName(Component.translatable(pStack.getDescriptionId() + TheurgyConstants.I18n.Item.ALCHEMICAL_SULFUR_SOURCE_SUFFIX)); + } + + var source = getSourceStack(pStack); + + if (!source.isEmpty()) { + var sourceId = getSourceItemId(pStack); + if (sourceId.startsWith("#") && this.overrideTagSourceName) { + var tagId = new ResourceLocation(sourceId.substring(1)); + return formatSourceName(Component.translatable(Util.makeDescriptionId("tag", tagId))); + } + + if (source.getHoverName() instanceof MutableComponent hoverName) + return formatSourceName(hoverName); + } + + return Component.translatable(TheurgyConstants.I18n.Item.ALCHEMICAL_SULFUR_UNKNOWN_SOURCE); + } + + @Override + public void initializeClient(Consumer consumer) { + consumer.accept(new IClientItemExtensions() { + @Override + public BlockEntityWithoutLevelRenderer getCustomRenderer() { + return AlchemicalSulfurBEWLR.get(); + } + }); + } + + @Override + public Component getName(ItemStack pStack) { + if (this.useAutomaticNameRendering) { + return Component.translatable(this.getDescriptionId(pStack), ComponentUtils.wrapInSquareBrackets( + this.getSourceName(pStack) + )); + } + return super.getName(pStack); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/item/DivinationRodItem.java b/src/main/java/com/klikli_dev/theurgy/content/item/DivinationRodItem.java similarity index 75% rename from src/main/java/com/klikli_dev/theurgy/item/DivinationRodItem.java rename to src/main/java/com/klikli_dev/theurgy/content/item/DivinationRodItem.java index 8a731008b..506b846c9 100644 --- a/src/main/java/com/klikli_dev/theurgy/item/DivinationRodItem.java +++ b/src/main/java/com/klikli_dev/theurgy/content/item/DivinationRodItem.java @@ -1,18 +1,19 @@ /* - * SPDX-FileCopyrightText: 2022 klikli-dev + * SPDX-FileCopyrightText: 2023 klikli-dev * * SPDX-License-Identifier: MIT */ -package com.klikli_dev.theurgy.item; +package com.klikli_dev.theurgy.content.item; import com.klikli_dev.theurgy.TheurgyConstants; -import com.klikli_dev.theurgy.client.scanner.ScanManager; -import com.klikli_dev.theurgy.entity.FollowProjectile; +import com.klikli_dev.theurgy.content.entity.FollowProjectile; import com.klikli_dev.theurgy.network.Networking; import com.klikli_dev.theurgy.network.messages.MessageSetDivinationResult; +import com.klikli_dev.theurgy.registry.BlockTagRegistry; import com.klikli_dev.theurgy.registry.SoundRegistry; -import com.klikli_dev.theurgy.registry.TagRegistry; +import com.klikli_dev.theurgy.scanner.ScanManager; +import com.klikli_dev.theurgy.util.TagUtil; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; @@ -39,7 +40,6 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.Vec3; import net.minecraftforge.common.TierSortingRegistry; -import net.minecraftforge.common.capabilities.ICapabilityProvider; import net.minecraftforge.registries.ForgeRegistries; import org.jetbrains.annotations.Nullable; @@ -72,6 +72,51 @@ public DivinationRodItem(Properties pProperties, Tier defaultTier, TagKey this.defaultAllowAttuning = defaultAllowAttuning; } + public static String getLinkedBlockId(ItemStack divinationRod) { + return divinationRod.getOrCreateTag().getString(TheurgyConstants.Nbt.Divination.LINKED_BLOCK_ID); + } + + public static boolean hasLinkedBlock(ItemStack divinationRod) { + return divinationRod.hasTag() && divinationRod.getTag().contains(TheurgyConstants.Nbt.Divination.LINKED_BLOCK_ID); + } + + public static ItemStack getLinkedBlockStack(ItemStack divinationRod) { + if (hasLinkedBlock(divinationRod)) { + var targetId = getLinkedBlockId(divinationRod); + ItemStack targetStack; + + if (targetId.startsWith("#")) { + var tagId = new ResourceLocation(targetId.substring(1)); + var tag = TagKey.create(Registries.ITEM, tagId); + targetStack = TagUtil.getItemStackForTag(tag); + } else { + var itemId = new ResourceLocation(targetId); + targetStack = new ItemStack(ForgeRegistries.ITEMS.getValue(itemId)); + } + + return targetStack; + } + + return ItemStack.EMPTY; + } + + private static void scanLinkedBlock(Player player, String id, int range, int duration) { + var targetId = new ResourceLocation(id); + + var blocks = getScanTargetsForId(targetId); + ScanManager.get().beginScan(player, blocks, range, duration); + } + + private static void scanLinkedTag(Player player, String id, int range, int duration) { + var targetId = new ResourceLocation(id.substring(1)); //skip the # + var tagKey = TagKey.create(Registries.BLOCK, targetId); + var blocks = ForgeRegistries.BLOCKS.tags().getTag(tagKey).stream().collect(Collectors.toSet()); + + if (!blocks.isEmpty()) { + ScanManager.get().beginScan(player, blocks, range, duration); + } + } + public static Set getScanTargetsForId(ResourceLocation linkedBlockId) { //First: try to get a tag for the given block. var tagKey = TagKey.create(Registries.BLOCK, getOreTagFromBlockId(linkedBlockId)); @@ -207,7 +252,7 @@ public InteractionResultHolder use(Level level, Player player, Intera var stack = player.getItemInHand(hand); if (!player.isShiftKeyDown()) { - if (stack.getOrCreateTag().contains(TheurgyConstants.Nbt.Divination.LINKED_BLOCK_ID)) { + if (hasLinkedBlock(stack)) { var tag = stack.getTag(); tag.putFloat(TheurgyConstants.Nbt.Divination.DISTANCE, SEARCHING); player.startUsingItem(hand); @@ -215,14 +260,17 @@ public InteractionResultHolder use(Level level, Player player, Intera 1, 1); if (level.isClientSide) { - var id = new ResourceLocation(stack.getTag().getString(TheurgyConstants.Nbt.Divination.LINKED_BLOCK_ID)); - - var blocks = getScanTargetsForId(id); - ScanManager.get().beginScan(player, - blocks, - tag.getInt(TheurgyConstants.Nbt.Divination.SETTING_RANGE), - tag.getInt(TheurgyConstants.Nbt.Divination.SETTING_DURATION) - ); + var targetId = getLinkedBlockId(stack); + + if (targetId.startsWith("#")) { + scanLinkedTag(player, targetId, + tag.getInt(TheurgyConstants.Nbt.Divination.SETTING_RANGE), + tag.getInt(TheurgyConstants.Nbt.Divination.SETTING_DURATION)); + } else { + scanLinkedBlock(player, targetId, + tag.getInt(TheurgyConstants.Nbt.Divination.SETTING_RANGE), + tag.getInt(TheurgyConstants.Nbt.Divination.SETTING_DURATION)); + } } } else if (!level.isClientSide) { player.sendSystemMessage(Component.translatable(TheurgyConstants.I18n.Message.DIVINATION_ROD_NO_LINK)); @@ -237,6 +285,7 @@ public ItemStack finishUsingItem(ItemStack stack, Level level, LivingEntity enti if (!(entityLiving instanceof Player player)) return stack; + if (stack.getDamageValue() >= stack.getMaxDamage()) { //if in the last usage cycle the item was used up, we now actually break it to avoid over-use player.broadcastBreakEvent(player.getUsedItemHand()); @@ -261,9 +310,11 @@ public ItemStack finishUsingItem(ItemStack stack, Level level, LivingEntity enti this.spawnResultParticle(result, level, player); } } else { - //only hurt, but do not break -> this allows using the rod without breaking it when we just re-use a saved result. - //we break it at the beginning of this method if we are at >= max damage. - stack.hurt(1, player.getRandom(), null); + //no damage for players in creative mode + if (!player.getAbilities().instabuild) + //only hurt, but do not break -> this allows using the rod without breaking it when we just re-use a saved result. + //we break it at the beginning of this method if we are at >= max damage. + stack.hurt(1, player.getRandom(), null); } return stack; } @@ -301,19 +352,21 @@ public void releaseUsing(ItemStack stack, Level level, LivingEntity pLivingEntit @Override public Component getName(ItemStack pStack) { - if (pStack.hasTag()) { - var tag = pStack.getTag(); - if (tag.contains(TheurgyConstants.Nbt.Divination.LINKED_BLOCK_ID)) { - var id = new ResourceLocation(pStack.getTag().getString(TheurgyConstants.Nbt.Divination.LINKED_BLOCK_ID)); - var block = ForgeRegistries.BLOCKS.getValue(id); - if (block != null) { - //we''re not using getBlockDisplayComponent because we want custom formatting - var blockComponent = ComponentUtils.wrapInSquareBrackets( - block.getName().withStyle(Style.EMPTY.withColor(ChatFormatting.GREEN).withItalic(true)) - ) - .withStyle((style) -> style.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_ITEM, new HoverEvent.ItemStackInfo(new ItemStack(block))))); - return Component.translatable(this.getDescriptionId() + ".linked", blockComponent); - } + if (hasLinkedBlock(pStack)) { + var stack = getLinkedBlockStack(pStack); + if (!stack.isEmpty()) { + var blockComponent = ComponentUtils.wrapInSquareBrackets( + Component.empty().append(stack.getHoverName()).withStyle(Style.EMPTY.withColor(ChatFormatting.GREEN).withItalic(true)) + ) + .withStyle((style) -> style.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_ITEM, new HoverEvent.ItemStackInfo(stack)))); + return Component.translatable(this.getDescriptionId() + ".linked", blockComponent); + } else { + //in case the block is not found, we indicate something went wrong + var blockComponent = ComponentUtils.wrapInSquareBrackets( + Component.translatable(TheurgyConstants.I18n.Item.DIVINATION_ROD_UNKNOWN_LINKED_BLOCK).withStyle(Style.EMPTY.withColor(ChatFormatting.RED).withItalic(true)) + ) + .withStyle((style) -> style.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_ITEM, new HoverEvent.ItemStackInfo(stack)))); + return Component.translatable(this.getDescriptionId() + ".linked", blockComponent); } } @@ -353,32 +406,31 @@ public void verifyTagAfterLoad(CompoundTag tag) { @Override public void appendHoverText(ItemStack pStack, @Nullable Level pLevel, List pTooltipComponents, TooltipFlag pIsAdvanced) { - if (pStack.hasTag()) { - var tag = pStack.getTag(); - if (tag.contains(TheurgyConstants.Nbt.Divination.LINKED_BLOCK_ID)) { - var id = new ResourceLocation(pStack.getTag().getString(TheurgyConstants.Nbt.Divination.LINKED_BLOCK_ID)); - var block = ForgeRegistries.BLOCKS.getValue(id); - if (block != null) { - var blockComponent = this.getBlockDisplayComponent(block); - pTooltipComponents.add( - Component.translatable( - TheurgyConstants.I18n.Tooltip.DIVINATION_ROD_LINKED_TO, - blockComponent - ).withStyle(ChatFormatting.GRAY)); - - if (tag.contains(TheurgyConstants.Nbt.Divination.POS)) { - var pos = BlockPos.of(tag.getLong(TheurgyConstants.Nbt.Divination.POS)); - pTooltipComponents.add(Component.translatable(TheurgyConstants.I18n.Tooltip.DIVINATION_ROD_LAST_RESULT, - blockComponent, - ComponentUtils.wrapInSquareBrackets(Component.literal(pos.toShortString())).withStyle(ChatFormatting.GREEN) + if (hasLinkedBlock(pStack)) { + var stack = getLinkedBlockStack(pStack); + if (!stack.isEmpty()) { + var blockComponent = Component.empty().append(stack.getHoverName()) + .withStyle(ChatFormatting.GREEN) + .withStyle((style) -> style.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_ITEM, new HoverEvent.ItemStackInfo(stack)))); + + this.getBlockDisplayComponent(stack); + pTooltipComponents.add( + Component.translatable( + TheurgyConstants.I18n.Tooltip.DIVINATION_ROD_LINKED_TO, + blockComponent ).withStyle(ChatFormatting.GRAY)); - } - } - } else { - pTooltipComponents.add(Component.translatable(TheurgyConstants.I18n.Tooltip.DIVINATION_ROD_NO_LINK)); + if (pStack.getTag().contains(TheurgyConstants.Nbt.Divination.POS)) { + var pos = BlockPos.of(pStack.getTag().getLong(TheurgyConstants.Nbt.Divination.POS)); + pTooltipComponents.add(Component.translatable(TheurgyConstants.I18n.Tooltip.DIVINATION_ROD_LAST_RESULT, + blockComponent, + ComponentUtils.wrapInSquareBrackets(Component.literal(pos.toShortString()).withStyle(ChatFormatting.GREEN)) + ).withStyle(ChatFormatting.GRAY)); + } } + } else { + pTooltipComponents.add(Component.translatable(TheurgyConstants.I18n.Tooltip.DIVINATION_ROD_NO_LINK)); } super.appendHoverText(pStack, pLevel, pTooltipComponents, pIsAdvanced); @@ -416,10 +468,14 @@ public float getDistance(Vec3 playerPosition, BlockPos result) { } protected MutableComponent getBlockDisplayComponent(Block block) { - var displayName = block.getName(); + return this.getBlockDisplayComponent(new ItemStack(block)); + } + + protected MutableComponent getBlockDisplayComponent(ItemStack stack) { + var displayName = stack.getHoverName(); return ComponentUtils.wrapInSquareBrackets(displayName) .withStyle(ChatFormatting.GREEN) - .withStyle((style) -> style.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_ITEM, new HoverEvent.ItemStackInfo(new ItemStack(block))))); + .withStyle((style) -> style.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_ITEM, new HoverEvent.ItemStackInfo(stack)))); } protected void spawnResultParticle(BlockPos result, Level level, LivingEntity entity) { @@ -443,12 +499,12 @@ public Tier getMiningTier(ItemStack stack) { public TagKey getAllowedBlocksTag(ItemStack stack) { var allowedBlocksTag = stack.getOrCreateTag().getString(TheurgyConstants.Nbt.Divination.SETTING_ALLOWED_BLOCKS_TAG); - return TagRegistry.makeBlockTag(new ResourceLocation(allowedBlocksTag)); + return BlockTagRegistry.tag(new ResourceLocation(allowedBlocksTag)); } public TagKey getDisallowedBlocksTag(ItemStack stack) { var disallowedBlocksTag = stack.getOrCreateTag().getString(TheurgyConstants.Nbt.Divination.SETTING_DISALLOWED_BLOCKS_TAG); - return TagRegistry.makeBlockTag(new ResourceLocation(disallowedBlocksTag)); + return BlockTagRegistry.tag(new ResourceLocation(disallowedBlocksTag)); } diff --git a/src/main/java/com/klikli_dev/theurgy/client/render/SulfurBEWLR.java b/src/main/java/com/klikli_dev/theurgy/content/item/render/AlchemicalSulfurBEWLR.java similarity index 89% rename from src/main/java/com/klikli_dev/theurgy/client/render/SulfurBEWLR.java rename to src/main/java/com/klikli_dev/theurgy/content/item/render/AlchemicalSulfurBEWLR.java index eaea6fd6c..30dcf84e7 100644 --- a/src/main/java/com/klikli_dev/theurgy/client/render/SulfurBEWLR.java +++ b/src/main/java/com/klikli_dev/theurgy/content/item/render/AlchemicalSulfurBEWLR.java @@ -1,13 +1,13 @@ /* - * SPDX-FileCopyrightText: 2022 klikli-dev + * SPDX-FileCopyrightText: 2023 klikli-dev * * SPDX-License-Identifier: MIT */ -package com.klikli_dev.theurgy.client.render; +package com.klikli_dev.theurgy.content.item.render; import com.klikli_dev.theurgy.config.ClientConfig; -import com.klikli_dev.theurgy.item.AlchemicalSulfurItem; +import com.klikli_dev.theurgy.content.item.AlchemicalSulfurItem; import com.klikli_dev.theurgy.registry.ItemRegistry; import com.mojang.blaze3d.platform.Lighting; import com.mojang.blaze3d.vertex.PoseStack; @@ -19,18 +19,18 @@ import net.minecraft.world.item.ItemDisplayContext; import net.minecraft.world.item.ItemStack; -public class SulfurBEWLR extends BlockEntityWithoutLevelRenderer { +public class AlchemicalSulfurBEWLR extends BlockEntityWithoutLevelRenderer { - private static final SulfurBEWLR instance = new SulfurBEWLR(); + private static final AlchemicalSulfurBEWLR instance = new AlchemicalSulfurBEWLR(); private static final ItemStack emptyJarStack = new ItemStack(ItemRegistry.EMPTY_JAR.get()); private static final ItemStack labeledEmptyJarStack = new ItemStack(ItemRegistry.EMPTY_JAR_LABELED.get()); private static final ItemStack labelStack = new ItemStack(ItemRegistry.JAR_LABEL.get()); - public SulfurBEWLR() { + public AlchemicalSulfurBEWLR() { super(null, null); } - public static SulfurBEWLR get() { + public static AlchemicalSulfurBEWLR get() { return instance; } @@ -98,7 +98,7 @@ public void renderLabel(ItemStack sulfurStack, ItemDisplayContext displayContext pPoseStack.popPose(); } - public void renderContainedItem(ItemStack sulfurStack, ItemDisplayContext displayContext, PoseStack pPoseStack, MultiBufferSource pBuffer, int pPackedLight, int pPackedOverlay) { + public void renderContainedItem(ItemStack sulfurStack, ItemDisplayContext pTransformType, PoseStack pPoseStack, MultiBufferSource pBuffer, int pPackedLight, int pPackedOverlay) { ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer(); @@ -107,9 +107,10 @@ public void renderContainedItem(ItemStack sulfurStack, ItemDisplayContext displa BakedModel containedModel = itemRenderer.getModel(containedStack, null, null, 0); BakedModel labelModel = itemRenderer.getModel(labelStack, null, null, 0); pPoseStack.pushPose(); + //now apply the transform to the contained item to make it look right in-world -> because below we render with gui transform which would mess it up //despite this returning a model (self in fact) it actually modifies the pose stack, hence the pushPose above! - labelModel.applyTransform(displayContext, pPoseStack, isLeftHand(displayContext)); //reuse the label transform to simulate flat items even if the contained item is 3d + labelModel.applyTransform(pTransformType, pPoseStack, isLeftHand(pTransformType)); //reuse the label transform to simulate flat items even if the contained item is 3d pPoseStack.pushPose(); @@ -122,7 +123,7 @@ public void renderContainedItem(ItemStack sulfurStack, ItemDisplayContext displa pPoseStack.scale(0.74F, 0.74F, 0.01F); //flatten item Lighting.setupForFlatItems(); //always render "labeled" item flat - itemRenderer.render(containedStack, ItemDisplayContext.GUI, isLeftHand(displayContext), pPoseStack, pBuffer, pPackedLight, pPackedOverlay, containedModel); + itemRenderer.render(containedStack, ItemDisplayContext.GUI, isLeftHand(pTransformType), pPoseStack, pBuffer, pPackedLight, pPackedOverlay, containedModel); //note: if we reset to 3d item light here it ignores it above and renders dark .. idk why pPoseStack.popPose(); diff --git a/src/main/java/com/klikli_dev/theurgy/client/particle/ParticleColor.java b/src/main/java/com/klikli_dev/theurgy/content/particle/ParticleColor.java similarity index 92% rename from src/main/java/com/klikli_dev/theurgy/client/particle/ParticleColor.java rename to src/main/java/com/klikli_dev/theurgy/content/particle/ParticleColor.java index f40dcce55..37669fb57 100644 --- a/src/main/java/com/klikli_dev/theurgy/client/particle/ParticleColor.java +++ b/src/main/java/com/klikli_dev/theurgy/content/particle/ParticleColor.java @@ -1,10 +1,10 @@ /* - * SPDX-FileCopyrightText: 2022 the original author or authors of Ars Noveau https://github.com/baileyholl/Ars-Nouveau + * SPDX-FileCopyrightText: 2023 klikli-dev * - * SPDX-License-Identifier: LGPL-3.0-only + * SPDX-License-Identifier: MIT */ -package com.klikli_dev.theurgy.client.particle; +package com.klikli_dev.theurgy.content.particle; import net.minecraft.nbt.CompoundTag; import net.minecraft.util.RandomSource; @@ -90,7 +90,7 @@ public CompoundTag serialize() { } public String toString() { - return "" + this.r + "," + this.g + "," + this.b; + return this.r + "," + this.g + "," + this.b; } public IntWrapper toWrapper() { @@ -132,7 +132,7 @@ public IntWrapper(ParticleColor color) { this.b = (int) (color.getBlue() * 255.0); } - public ParticleColor toParticleColor() { + public ParticleColor toColorParticle() { return new ParticleColor(this.r, this.g, this.b); } diff --git a/src/main/java/com/klikli_dev/theurgy/client/particle/ParticleRenderTypes.java b/src/main/java/com/klikli_dev/theurgy/content/particle/ParticleRenderTypes.java similarity index 85% rename from src/main/java/com/klikli_dev/theurgy/client/particle/ParticleRenderTypes.java rename to src/main/java/com/klikli_dev/theurgy/content/particle/ParticleRenderTypes.java index 9395bd99a..a473829e8 100644 --- a/src/main/java/com/klikli_dev/theurgy/client/particle/ParticleRenderTypes.java +++ b/src/main/java/com/klikli_dev/theurgy/content/particle/ParticleRenderTypes.java @@ -1,11 +1,11 @@ /* - * SPDX-FileCopyrightText: 2022 the original author or authors of Ars Noveau https://github.com/baileyholl/Ars-Nouveau + * SPDX-FileCopyrightText: 2023 klikli-dev * - * SPDX-License-Identifier: LGPL-3.0-only + * SPDX-License-Identifier: MIT */ -package com.klikli_dev.theurgy.client.particle; +package com.klikli_dev.theurgy.content.particle; import com.klikli_dev.theurgy.Theurgy; import com.mojang.blaze3d.platform.GlStateManager; @@ -20,8 +20,9 @@ import net.minecraft.client.renderer.texture.TextureManager; public class ParticleRenderTypes { - static final ParticleRenderType EMBER_RENDER = new ParticleRenderType() { + public static final ParticleRenderType EMBER_RENDER = new ParticleRenderType() { @Override + @SuppressWarnings("deprecation") public void begin(BufferBuilder buffer, TextureManager textureManager) { Minecraft.getInstance().gameRenderer.lightTexture().turnOnLightLayer(); RenderSystem.enableBlend(); @@ -44,8 +45,9 @@ public String toString() { } }; - static final ParticleRenderType EMBER_RENDER_NO_MASK = new ParticleRenderType() { + public static final ParticleRenderType EMBER_RENDER_NO_MASK = new ParticleRenderType() { @Override + @SuppressWarnings("deprecation") public void begin(BufferBuilder buffer, TextureManager textureManager) { RenderSystem.disableDepthTest(); RenderSystem.enableBlend(); diff --git a/src/main/java/com/klikli_dev/theurgy/content/particle/coloredbubble/ColoredBubbleParticle.java b/src/main/java/com/klikli_dev/theurgy/content/particle/coloredbubble/ColoredBubbleParticle.java new file mode 100644 index 000000000..f1ad1b251 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/particle/coloredbubble/ColoredBubbleParticle.java @@ -0,0 +1,82 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + + +package com.klikli_dev.theurgy.content.particle.coloredbubble; + + +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.ParticleRenderType; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.client.particle.TextureSheetParticle; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; +import org.joml.Math; + +@OnlyIn(Dist.CLIENT) +public class ColoredBubbleParticle extends TextureSheetParticle { + + private final SpriteSet sprite; + public float colorR; + public float colorG; + public float colorB; + + + public ColoredBubbleParticle(ClientLevel worldIn, double x, double y, double z, double vx, double vy, double vz, float r, float g, float b, SpriteSet sprite) { + super(worldIn, x, y, z, 0, 0, 0); + this.hasPhysics = false; + + this.colorR = r; + this.colorG = g; + this.colorB = b; + if (this.colorR > 1.0) { + this.colorR = this.colorR / 255.0f; + } + if (this.colorG > 1.0) { + this.colorG = this.colorG / 255.0f; + } + if (this.colorB > 1.0) { + this.colorB = this.colorB / 255.0f; + } + this.setColor(this.colorR, this.colorG, this.colorB); + + this.lifetime = 10; + + this.quadSize = 0.05f; + + this.xd = vx; + this.yd = vy; + this.zd = vz; + + this.sprite = sprite; + this.pickSprite(this.sprite); + } + + @Override + public ParticleRenderType getRenderType() { + return ParticleRenderType.PARTICLE_SHEET_TRANSLUCENT; + } + + + @Override + public void tick() { + super.tick(); + float progress = (float) this.age / this.lifetime; + //change particle based on age progress + this.setAlpha(Math.lerp(progress, 1.0f, 0.75f)); + + //slow down y motion over time + this.yd *= 0.75f; + + //select new visual based on updated age + this.setSpriteFromAge(this.sprite); + } + + @Override + public boolean isAlive() { + return this.age < this.lifetime; + } +} \ No newline at end of file diff --git a/src/main/java/com/klikli_dev/theurgy/content/particle/coloredbubble/ColoredBubbleParticleOptions.java b/src/main/java/com/klikli_dev/theurgy/content/particle/coloredbubble/ColoredBubbleParticleOptions.java new file mode 100644 index 000000000..1e504f6dc --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/particle/coloredbubble/ColoredBubbleParticleOptions.java @@ -0,0 +1,69 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.particle.coloredbubble; + +import com.klikli_dev.theurgy.content.particle.ParticleColor; +import com.klikli_dev.theurgy.registry.ParticleRegistry; +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.particles.ParticleOptions; +import net.minecraft.core.particles.ParticleType; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.registries.ForgeRegistries; + +public class ColoredBubbleParticleOptions implements ParticleOptions { + + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.FLOAT.fieldOf("r").forGetter(d -> d.color.getRed()), + Codec.FLOAT.fieldOf("g").forGetter(d -> d.color.getGreen()), + Codec.FLOAT.fieldOf("b").forGetter(d -> d.color.getBlue()) + ) + .apply(instance, ColoredBubbleParticleOptions::new)); + + @SuppressWarnings("deprecation") + public static final ParticleOptions.Deserializer DESERIALIZER = new ParticleOptions.Deserializer<>() { + @Override + public ColoredBubbleParticleOptions fromCommand(ParticleType type, StringReader reader) throws CommandSyntaxException { + reader.expect(' '); + return new ColoredBubbleParticleOptions(type, ParticleColor.fromString(reader.readString())); + } + + @Override + public ColoredBubbleParticleOptions fromNetwork(ParticleType type, FriendlyByteBuf buffer) { + return new ColoredBubbleParticleOptions(type, ParticleColor.deserialize(buffer.readNbt())); + } + }; + private final ParticleType type; + public ParticleColor color; + + public ColoredBubbleParticleOptions(float r, float g, float b) { + this(ParticleRegistry.COLORED_BUBBLE_TYPE.get(), new ParticleColor(r, g, b)); + } + + public ColoredBubbleParticleOptions(ParticleType particleTypeData, ParticleColor color) { + this.type = particleTypeData; + this.color = color; + } + + + @Override + public ParticleType getType() { + return this.type; + } + + @Override + public void writeToNetwork(FriendlyByteBuf packetBuffer) { + packetBuffer.writeNbt(this.color.serialize()); + } + + @Override + public String writeToString() { + return ForgeRegistries.PARTICLE_TYPES.getKey(this.type) + " " + this.color.serialize(); + } +} \ No newline at end of file diff --git a/src/main/java/com/klikli_dev/theurgy/content/particle/coloredbubble/ColoredBubbleParticleProvider.java b/src/main/java/com/klikli_dev/theurgy/content/particle/coloredbubble/ColoredBubbleParticleProvider.java new file mode 100644 index 000000000..50e90182a --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/particle/coloredbubble/ColoredBubbleParticleProvider.java @@ -0,0 +1,33 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + + +package com.klikli_dev.theurgy.content.particle.coloredbubble; + +import com.klikli_dev.theurgy.content.particle.ParticleColor; +import com.klikli_dev.theurgy.registry.ParticleRegistry; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.core.particles.ParticleOptions; + +public class ColoredBubbleParticleProvider implements ParticleProvider { + private final SpriteSet spriteSet; + + public ColoredBubbleParticleProvider(SpriteSet sprite) { + this.spriteSet = sprite; + } + + public static ParticleOptions createOptions(ParticleColor color) { + return new ColoredBubbleParticleOptions(ParticleRegistry.COLORED_BUBBLE_TYPE.get(), color); + } + + @Override + public Particle createParticle(ColoredBubbleParticleOptions data, ClientLevel worldIn, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + return new ColoredBubbleParticle(worldIn, x, y, z, xSpeed, ySpeed, zSpeed, data.color.getRed(), data.color.getGreen(), data.color.getBlue(), this.spriteSet); + } +} \ No newline at end of file diff --git a/src/main/java/com/klikli_dev/theurgy/content/particle/coloredbubble/ColoredBubbleParticleType.java b/src/main/java/com/klikli_dev/theurgy/content/particle/coloredbubble/ColoredBubbleParticleType.java new file mode 100644 index 000000000..a62dc5451 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/particle/coloredbubble/ColoredBubbleParticleType.java @@ -0,0 +1,21 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.particle.coloredbubble; + +import com.mojang.serialization.Codec; +import net.minecraft.core.particles.ParticleType; + +public class ColoredBubbleParticleType extends ParticleType { + public ColoredBubbleParticleType() { + super(false, ColoredBubbleParticleOptions.DESERIALIZER); + } + + @Override + public Codec codec() { + return ColoredBubbleParticleOptions.CODEC; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/client/particle/ParticleGlow.java b/src/main/java/com/klikli_dev/theurgy/content/particle/glow/GlowParticle.java similarity index 87% rename from src/main/java/com/klikli_dev/theurgy/client/particle/ParticleGlow.java rename to src/main/java/com/klikli_dev/theurgy/content/particle/glow/GlowParticle.java index 6058bab1f..b9e4c7ba6 100644 --- a/src/main/java/com/klikli_dev/theurgy/client/particle/ParticleGlow.java +++ b/src/main/java/com/klikli_dev/theurgy/content/particle/glow/GlowParticle.java @@ -1,13 +1,14 @@ /* - * SPDX-FileCopyrightText: 2022 the original author or authors of Ars Noveau https://github.com/baileyholl/Ars-Nouveau + * SPDX-FileCopyrightText: 2023 klikli-dev * - * SPDX-License-Identifier: LGPL-3.0-only + * SPDX-License-Identifier: MIT */ -package com.klikli_dev.theurgy.client.particle; +package com.klikli_dev.theurgy.content.particle.glow; +import com.klikli_dev.theurgy.content.particle.ParticleRenderTypes; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.ParticleRenderType; import net.minecraft.client.particle.SpriteSet; @@ -18,7 +19,7 @@ import java.util.Random; @OnlyIn(Dist.CLIENT) -public class ParticleGlow extends TextureSheetParticle { +public class GlowParticle extends TextureSheetParticle { public float colorR = 0; public float colorG = 0; public float colorB = 0; @@ -27,7 +28,7 @@ public class ParticleGlow extends TextureSheetParticle { public boolean disableDepthTest; - public ParticleGlow(ClientLevel worldIn, double x, double y, double z, double vx, double vy, double vz, float r, float g, float b, float a, float scale, int lifetime, SpriteSet sprite, boolean disableDepthTest) { + public GlowParticle(ClientLevel worldIn, double x, double y, double z, double vx, double vy, double vz, float r, float g, float b, float a, float scale, int lifetime, SpriteSet sprite, boolean disableDepthTest) { super(worldIn, x, y, z, 0, 0, 0); this.hasPhysics = false; diff --git a/src/main/java/com/klikli_dev/theurgy/client/particle/ColorParticleTypeData.java b/src/main/java/com/klikli_dev/theurgy/content/particle/glow/GlowParticleOptions.java similarity index 58% rename from src/main/java/com/klikli_dev/theurgy/client/particle/ColorParticleTypeData.java rename to src/main/java/com/klikli_dev/theurgy/content/particle/glow/GlowParticleOptions.java index 60b785abf..a04b90bac 100644 --- a/src/main/java/com/klikli_dev/theurgy/client/particle/ColorParticleTypeData.java +++ b/src/main/java/com/klikli_dev/theurgy/content/particle/glow/GlowParticleOptions.java @@ -1,11 +1,12 @@ /* - * SPDX-FileCopyrightText: 2022 the original author or authors of Ars Noveau https://github.com/baileyholl/Ars-Nouveau + * SPDX-FileCopyrightText: 2023 klikli-dev * - * SPDX-License-Identifier: LGPL-3.0-only + * SPDX-License-Identifier: MIT */ -package com.klikli_dev.theurgy.client.particle; +package com.klikli_dev.theurgy.content.particle.glow; +import com.klikli_dev.theurgy.content.particle.ParticleColor; import com.klikli_dev.theurgy.registry.ParticleRegistry; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; @@ -21,9 +22,9 @@ * Simplified version of ElementalCraft */ -public class ColorParticleTypeData implements ParticleOptions { +public class GlowParticleOptions implements ParticleOptions { - public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( Codec.FLOAT.fieldOf("r").forGetter(d -> d.color.getRed()), Codec.FLOAT.fieldOf("g").forGetter(d -> d.color.getGreen()), Codec.FLOAT.fieldOf("b").forGetter(d -> d.color.getBlue()), @@ -32,39 +33,41 @@ public class ColorParticleTypeData implements ParticleOptions { Codec.FLOAT.fieldOf("alpha").forGetter(d -> d.alpha), Codec.INT.fieldOf("age").forGetter(d -> d.age) ) - .apply(instance, ColorParticleTypeData::new)); - static final Deserializer DESERIALIZER = new Deserializer<>() { + .apply(instance, GlowParticleOptions::new)); + + @SuppressWarnings("deprecation") + public static final Deserializer DESERIALIZER = new Deserializer<>() { @Override - public ColorParticleTypeData fromCommand(ParticleType type, StringReader reader) throws CommandSyntaxException { + public GlowParticleOptions fromCommand(ParticleType type, StringReader reader) throws CommandSyntaxException { reader.expect(' '); - return new ColorParticleTypeData(type, ParticleColor.fromString(reader.readString()), reader.readBoolean()); + return new GlowParticleOptions(type, ParticleColor.fromString(reader.readString()), reader.readBoolean()); } @Override - public ColorParticleTypeData fromNetwork(ParticleType type, FriendlyByteBuf buffer) { - return new ColorParticleTypeData(type, ParticleColor.deserialize(buffer.readNbt()), buffer.readBoolean()); + public GlowParticleOptions fromNetwork(ParticleType type, FriendlyByteBuf buffer) { + return new GlowParticleOptions(type, ParticleColor.deserialize(buffer.readNbt()), buffer.readBoolean()); } }; - private final ParticleType type; + private final ParticleType type; public ParticleColor color; public boolean disableDepthTest; public float size = .25f; public float alpha = 1.0f; public int age = 36; - public ColorParticleTypeData(float r, float g, float b, boolean disableDepthTest, float size, float alpha, int age) { + public GlowParticleOptions(float r, float g, float b, boolean disableDepthTest, float size, float alpha, int age) { this(ParticleRegistry.GLOW_TYPE.get(), new ParticleColor(r, g, b), disableDepthTest, size, alpha, age); } - public ColorParticleTypeData(ParticleColor color, boolean disableDepthTest, float size, float alpha, int age) { + public GlowParticleOptions(ParticleColor color, boolean disableDepthTest, float size, float alpha, int age) { this(ParticleRegistry.GLOW_TYPE.get(), color, disableDepthTest, size, alpha, age); } - public ColorParticleTypeData(ParticleType particleTypeData, ParticleColor color, boolean disableDepthTest) { + public GlowParticleOptions(ParticleType particleTypeData, ParticleColor color, boolean disableDepthTest) { this(particleTypeData, color, disableDepthTest, 0.25f, 1.0f, 36); } - public ColorParticleTypeData(ParticleType particleTypeData, ParticleColor color, boolean disableDepthTest, float size, float alpha, int age) { + public GlowParticleOptions(ParticleType particleTypeData, ParticleColor color, boolean disableDepthTest, float size, float alpha, int age) { this.type = particleTypeData; this.color = color; this.disableDepthTest = disableDepthTest; @@ -75,7 +78,7 @@ public ColorParticleTypeData(ParticleType particleTypeDat @Override - public ParticleType getType() { + public ParticleType getType() { return this.type; } diff --git a/src/main/java/com/klikli_dev/theurgy/content/particle/glow/GlowParticleProvider.java b/src/main/java/com/klikli_dev/theurgy/content/particle/glow/GlowParticleProvider.java new file mode 100644 index 000000000..62bfe2894 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/particle/glow/GlowParticleProvider.java @@ -0,0 +1,45 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + + +package com.klikli_dev.theurgy.content.particle.glow; + +import com.klikli_dev.theurgy.content.particle.ParticleColor; +import com.klikli_dev.theurgy.registry.ParticleRegistry; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.particle.Particle; +import net.minecraft.client.particle.ParticleProvider; +import net.minecraft.client.particle.SpriteSet; +import net.minecraft.core.particles.ParticleOptions; + +public class GlowParticleProvider implements ParticleProvider { + private final SpriteSet spriteSet; + + public GlowParticleProvider(SpriteSet sprite) { + this.spriteSet = sprite; + } + + public static ParticleOptions createOptions(ParticleColor color) { + return new GlowParticleOptions(ParticleRegistry.GLOW_TYPE.get(), color, false); + } + + public static ParticleOptions createOptions(ParticleColor color, boolean disableDepthTest) { + return new GlowParticleOptions(ParticleRegistry.GLOW_TYPE.get(), color, disableDepthTest, 0.25f, 0.75f, 36); + } + + public static ParticleOptions createOptions(ParticleColor color, boolean disableDepthTest, float size, float alpha, int age) { + return new GlowParticleOptions(color, disableDepthTest, size, alpha, age); + } + + public static ParticleOptions createOptions(ParticleColor color, float size, float alpha, int age) { + return new GlowParticleOptions(color, false, size, alpha, age); + } + + @Override + public Particle createParticle(GlowParticleOptions data, ClientLevel worldIn, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed) { + return new GlowParticle(worldIn, x, y, z, xSpeed, ySpeed, zSpeed, data.color.getRed(), data.color.getGreen(), data.color.getBlue(), data.alpha, data.size, data.age, this.spriteSet, data.disableDepthTest); + } +} \ No newline at end of file diff --git a/src/main/java/com/klikli_dev/theurgy/content/particle/glow/GlowParticleType.java b/src/main/java/com/klikli_dev/theurgy/content/particle/glow/GlowParticleType.java new file mode 100644 index 000000000..6383de1dc --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/particle/glow/GlowParticleType.java @@ -0,0 +1,21 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.particle.glow; + +import com.mojang.serialization.Codec; +import net.minecraft.core.particles.ParticleType; + +public class GlowParticleType extends ParticleType { + public GlowParticleType() { + super(false, GlowParticleOptions.DESERIALIZER); + } + + @Override + public Codec codec() { + return GlowParticleOptions.CODEC; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/recipe/AccumulationRecipe.java b/src/main/java/com/klikli_dev/theurgy/content/recipe/AccumulationRecipe.java new file mode 100644 index 000000000..479889d19 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/recipe/AccumulationRecipe.java @@ -0,0 +1,176 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.recipe; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.klikli_dev.theurgy.content.recipe.ingredient.FluidIngredient; +import com.klikli_dev.theurgy.content.recipe.wrapper.RecipeWrapperWithFluid; +import com.klikli_dev.theurgy.registry.ItemRegistry; +import com.klikli_dev.theurgy.registry.RecipeSerializerRegistry; +import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; +import com.klikli_dev.theurgy.util.TheurgyExtraCodecs; +import com.mojang.serialization.Codec; +import com.mojang.serialization.JsonOps; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.NonNullList; +import net.minecraft.core.RegistryAccess; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; +import net.minecraftforge.fluids.FluidStack; +import org.jetbrains.annotations.Nullable; + +import java.util.Optional; + +public class AccumulationRecipe implements Recipe { + public static final int DEFAULT_ACCUMULATION_TIME = 200; + + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + FluidIngredient.CODEC.fieldOf("evaporant").forGetter((r) -> r.evaporant), + TheurgyExtraCodecs.INGREDIENT.optionalFieldOf("solute").forGetter(r -> Optional.ofNullable(r.solute)), + FluidStack.CODEC.fieldOf("result").forGetter(r -> r.result), + Codec.INT.optionalFieldOf("accumulation_time", DEFAULT_ACCUMULATION_TIME).forGetter(r -> r.accumulationTime) + ).apply(instance, (evaporant, solute, result, accumulation_time) -> new AccumulationRecipe(evaporant, solute.orElse(null), result, accumulation_time)) + ); + /** + * The fluid to evaporate to obtain the result. + */ + protected final FluidIngredient evaporant; + /** + * The (optional) item to dissolve in the evaporant to obtain the result. + */ + @Nullable + protected final Ingredient solute; + /** + * The result of the recipe. + */ + protected final FluidStack result; + protected final int accumulationTime; + protected ResourceLocation id; + + public AccumulationRecipe(FluidIngredient evaporant, @Nullable Ingredient solute, FluidStack result, int pAccumulationTime) { + this.evaporant = evaporant; + this.solute = solute; + this.result = result; + this.accumulationTime = pAccumulationTime; + } + + @Override + public boolean isSpecial() { + return true; + } + + @Override + public ResourceLocation getId() { + return this.id; + } + + @Override + public RecipeType getType() { + return RecipeTypeRegistry.ACCUMULATION.get(); + } + + @Override + public boolean matches(RecipeWrapperWithFluid pContainer, Level pLevel) { + boolean evaporantMatches = this.evaporant.test(pContainer.getTank().getFluidInTank(0)); + boolean soluteMatches = + pContainer.getItem(0).isEmpty() && !this.hasSolute() || //if recipe requires no solute and container does not have one we're ok + this.hasSolute() && this.solute.test(pContainer.getItem(0)); // if recipe requires solute we check if the container has it + + //note: it is important that if the container HAS a solute but the recipe does not require one, we do not match -> otherwise water -> sal ammoniac recipes would always match, even if the faster water + sal ammoniac crystal -> sal ammoniac recipe is available + + return soluteMatches && evaporantMatches; + } + + @Override + public ItemStack assemble(RecipeWrapperWithFluid pInv, RegistryAccess registryAccess) { + return ItemStack.EMPTY; + } + + public FluidStack assembleFluid(RecipeWrapperWithFluid pInv, RegistryAccess registryAccess) { + return this.result.copy(); + } + + @Override + public boolean canCraftInDimensions(int pWidth, int pHeight) { + return true; + } + + @Override + public ItemStack getResultItem(RegistryAccess registryAccess) { + return ItemStack.EMPTY; + } + + @Override + public NonNullList getIngredients() { + NonNullList nonnulllist = NonNullList.create(); + if (this.solute != null) + nonnulllist.add(this.solute); + return nonnulllist; + } + + @Override + public ItemStack getToastSymbol() { + return new ItemStack(ItemRegistry.SAL_AMMONIAC_ACCUMULATOR.get()); + } + + @Override + public RecipeSerializer getSerializer() { + return RecipeSerializerRegistry.ACCUMULATION.get(); + } + + public int getAccumulationTime() { + return this.accumulationTime; + } + + public FluidIngredient getEvaporant() { + return this.evaporant; + } + + @Nullable + public Ingredient getSolute() { + return this.solute; + } + + public boolean hasSolute() { + return this.solute != null; + } + + public FluidStack getResult() { + return this.result; + } + + public static class Serializer implements RecipeSerializer { + + @Override + public AccumulationRecipe fromJson(ResourceLocation pRecipeId, JsonObject pJson) { + var recipe = CODEC.parse(JsonOps.INSTANCE, pJson).getOrThrow(false, s -> { + throw new JsonParseException(s); + }); + recipe.id = pRecipeId; + return recipe; + } + + @Override + public AccumulationRecipe fromNetwork(ResourceLocation pRecipeId, FriendlyByteBuf pBuffer) { + var recipe = pBuffer.readJsonWithCodec(CODEC); + recipe.id = pRecipeId; + return recipe; + } + + @Override + public void toNetwork(FriendlyByteBuf pBuffer, AccumulationRecipe pRecipe) { + pBuffer.writeJsonWithCodec(CODEC, pRecipe); + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/recipe/CalcinationRecipe.java b/src/main/java/com/klikli_dev/theurgy/content/recipe/CalcinationRecipe.java new file mode 100644 index 000000000..050b812cd --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/recipe/CalcinationRecipe.java @@ -0,0 +1,135 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.recipe; + +import com.google.gson.JsonObject; +import com.klikli_dev.theurgy.registry.BlockRegistry; +import com.klikli_dev.theurgy.registry.RecipeSerializerRegistry; +import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; +import net.minecraft.core.NonNullList; +import net.minecraft.core.RegistryAccess; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; +import net.minecraftforge.common.crafting.CraftingHelper; +import net.minecraftforge.items.wrapper.RecipeWrapper; + +public class CalcinationRecipe implements Recipe { + + public static final int DEFAULT_CALCINATION_TIME = 200; + protected final ResourceLocation id; + protected final Ingredient ingredient; + protected final int ingredientCount; + protected final ItemStack result; + protected final int calcinationTime; + + public CalcinationRecipe(ResourceLocation pId, Ingredient pIngredient, int ingredientCount, ItemStack pResult, int calcinationTime) { + this.id = pId; + this.ingredient = pIngredient; + this.ingredientCount = ingredientCount; + this.result = pResult; + this.calcinationTime = calcinationTime; + } + + @Override + public boolean isSpecial() { + return true; + } + + public int getIngredientCount() { + return this.ingredientCount; + } + + @Override + public ResourceLocation getId() { + return this.id; + } + + @Override + public RecipeType getType() { + return RecipeTypeRegistry.CALCINATION.get(); + } + + @Override + public boolean matches(RecipeWrapper pContainer, Level pLevel) { + var stack = pContainer.getItem(0); + return this.ingredient.test(stack) && stack.getCount() >= this.ingredientCount; + } + + @Override + public ItemStack assemble(RecipeWrapper pInv, RegistryAccess registryAccess) { + return this.result.copy(); + } + + @Override + public boolean canCraftInDimensions(int pWidth, int pHeight) { + return true; + } + + @Override + public ItemStack getResultItem(RegistryAccess registryAccess) { + return this.result; + } + + @Override + public NonNullList getIngredients() { + NonNullList nonnulllist = NonNullList.create(); + nonnulllist.add(this.ingredient); + return nonnulllist; + } + + @Override + public ItemStack getToastSymbol() { + return new ItemStack(BlockRegistry.CALCINATION_OVEN.get()); + } + + @Override + public RecipeSerializer getSerializer() { + return RecipeSerializerRegistry.CALCINATION.get(); + } + + public int getCalcinationTime() { + return this.calcinationTime; + } + + public static class Serializer implements RecipeSerializer { + + @Override + public CalcinationRecipe fromJson(ResourceLocation pRecipeId, JsonObject pJson) { + var ingredientElement = GsonHelper.isArrayNode(pJson, "ingredient") ? GsonHelper.getAsJsonArray(pJson, "ingredient") : GsonHelper.getAsJsonObject(pJson, "ingredient"); + var ingredient = Ingredient.fromJson(ingredientElement); + var ingredientCount = GsonHelper.getAsInt(pJson, "ingredient_count", 1); + var result = CraftingHelper.getItemStack(GsonHelper.getAsJsonObject(pJson, "result"), true, true); + + var calcinationTime = GsonHelper.getAsInt(pJson, "calcination_time", DEFAULT_CALCINATION_TIME); + return new CalcinationRecipe(pRecipeId, ingredient, ingredientCount, result, calcinationTime); + } + + @Override + public CalcinationRecipe fromNetwork(ResourceLocation pRecipeId, FriendlyByteBuf pBuffer) { + var ingredient = Ingredient.fromNetwork(pBuffer); + var ingredientCount = pBuffer.readVarInt(); + var result = pBuffer.readItem(); + var calcinationTime = pBuffer.readVarInt(); + return new CalcinationRecipe(pRecipeId, ingredient, ingredientCount, result, calcinationTime); + } + + @Override + public void toNetwork(FriendlyByteBuf pBuffer, CalcinationRecipe pRecipe) { + pRecipe.ingredient.toNetwork(pBuffer); + pBuffer.writeVarInt(pRecipe.ingredientCount); + pBuffer.writeItem(pRecipe.result); + pBuffer.writeVarInt(pRecipe.calcinationTime); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/klikli_dev/theurgy/content/recipe/DistillationRecipe.java b/src/main/java/com/klikli_dev/theurgy/content/recipe/DistillationRecipe.java new file mode 100644 index 000000000..5de57846d --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/recipe/DistillationRecipe.java @@ -0,0 +1,139 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.recipe; + +import com.google.gson.JsonObject; +import com.klikli_dev.theurgy.registry.BlockRegistry; +import com.klikli_dev.theurgy.registry.RecipeSerializerRegistry; +import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; +import net.minecraft.core.NonNullList; +import net.minecraft.core.RegistryAccess; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; +import net.minecraftforge.common.crafting.CraftingHelper; +import net.minecraftforge.items.wrapper.RecipeWrapper; + +public class DistillationRecipe implements Recipe { + + public static final int DEFAULT_DISTILLATION_TIME = 200; + protected final ResourceLocation id; + protected final Ingredient ingredient; + protected final int ingredientCount; + protected final ItemStack result; + protected final int distillationTime; + + public DistillationRecipe(ResourceLocation pId, Ingredient pIngredient, int ingredientCount, ItemStack pResult, int distillationTime) { + this.id = pId; + this.ingredient = pIngredient; + this.ingredientCount = ingredientCount; + this.result = pResult; + this.distillationTime = distillationTime; + } + + @Override + public boolean isSpecial() { + return true; + } + + @Override + public ResourceLocation getId() { + return this.id; + } + + @Override + public RecipeType getType() { + return RecipeTypeRegistry.DISTILLATION.get(); + } + + @Override + public boolean matches(RecipeWrapper pContainer, Level pLevel) { + var stack = pContainer.getItem(0); + return this.ingredient.test(stack) && stack.getCount() >= this.ingredientCount; + } + + @Override + public ItemStack assemble(RecipeWrapper pInv, RegistryAccess registryAccess) { + return this.result.copy(); + } + + @Override + public boolean canCraftInDimensions(int pWidth, int pHeight) { + return true; + } + + @Override + public ItemStack getResultItem(RegistryAccess registryAccess) { + return this.result; + } + + @Override + public NonNullList getIngredients() { + NonNullList nonnulllist = NonNullList.create(); + nonnulllist.add(this.ingredient); + return nonnulllist; + } + + public Ingredient getIngredient() { + return this.ingredient; + } + + public int getIngredientCount() { + return this.ingredientCount; + } + + @Override + public ItemStack getToastSymbol() { + return new ItemStack(BlockRegistry.DISTILLER.get()); + } + + @Override + public RecipeSerializer getSerializer() { + return RecipeSerializerRegistry.DISTILLATION.get(); + } + + public int getDistillationTime() { + return this.distillationTime; + } + + public static class Serializer implements RecipeSerializer { + + @Override + public DistillationRecipe fromJson(ResourceLocation pRecipeId, JsonObject pJson) { + var ingredientElement = GsonHelper.isArrayNode(pJson, "ingredient") ? GsonHelper.getAsJsonArray(pJson, "ingredient") : GsonHelper.getAsJsonObject(pJson, "ingredient"); + var ingredient = Ingredient.fromJson(ingredientElement); + var ingredientCount = GsonHelper.getAsInt(pJson, "ingredient_count", 1); + var result = CraftingHelper.getItemStack(GsonHelper.getAsJsonObject(pJson, "result"), true, true); + + var distillationTime = GsonHelper.getAsInt(pJson, "distillation_time", DEFAULT_DISTILLATION_TIME); + return new DistillationRecipe(pRecipeId, ingredient, ingredientCount, result, distillationTime); + } + + @Override + public DistillationRecipe fromNetwork(ResourceLocation pRecipeId, FriendlyByteBuf pBuffer) { + var ingredient = Ingredient.fromNetwork(pBuffer); + var ingredientCount = pBuffer.readVarInt(); + var result = pBuffer.readItem(); + var distillationTime = pBuffer.readVarInt(); + return new DistillationRecipe(pRecipeId, ingredient, ingredientCount, result, distillationTime); + } + + @Override + public void toNetwork(FriendlyByteBuf pBuffer, DistillationRecipe pRecipe) { + pRecipe.ingredient.toNetwork(pBuffer); + pBuffer.writeVarInt(pRecipe.ingredientCount); + pBuffer.writeItem(pRecipe.result); + pBuffer.writeVarInt(pRecipe.distillationTime); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/klikli_dev/theurgy/recipe/DivinationRodRecipe.java b/src/main/java/com/klikli_dev/theurgy/content/recipe/DivinationRodRecipe.java similarity index 64% rename from src/main/java/com/klikli_dev/theurgy/recipe/DivinationRodRecipe.java rename to src/main/java/com/klikli_dev/theurgy/content/recipe/DivinationRodRecipe.java index 5d2b8cc01..518b862f2 100644 --- a/src/main/java/com/klikli_dev/theurgy/recipe/DivinationRodRecipe.java +++ b/src/main/java/com/klikli_dev/theurgy/content/recipe/DivinationRodRecipe.java @@ -1,20 +1,22 @@ /* - * SPDX-FileCopyrightText: 2022 klikli-dev + * SPDX-FileCopyrightText: 2023 klikli-dev * * SPDX-License-Identifier: MIT */ -package com.klikli_dev.theurgy.recipe; +package com.klikli_dev.theurgy.content.recipe; import com.google.gson.JsonObject; import com.klikli_dev.theurgy.Theurgy; import com.klikli_dev.theurgy.TheurgyConstants; import com.klikli_dev.theurgy.config.ServerConfig; -import com.klikli_dev.theurgy.registry.RecipeRegistry; +import com.klikli_dev.theurgy.registry.RecipeSerializerRegistry; import net.minecraft.core.NonNullList; import net.minecraft.core.RegistryAccess; +import net.minecraft.core.registries.Registries; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; import net.minecraft.world.inventory.CraftingContainer; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.CraftingBookCategory; @@ -30,8 +32,14 @@ public DivinationRodRecipe(ResourceLocation pId, String pGroup, int pWidth, int super(pId, pGroup, CraftingBookCategory.MISC, pWidth, pHeight, pRecipeItems, pResult); } + @Override + public boolean isSpecial() { + return true; + } + + @Override public RecipeSerializer getSerializer() { - return RecipeRegistry.DIVINATION_ROD.get(); + return RecipeSerializerRegistry.DIVINATION_ROD.get(); } @Override @@ -46,14 +54,14 @@ public ItemStack getResultItem(RegistryAccess registryAccess) { //this allows JEI/creative menu to show the correct linked block id effects (altered item name, tooltip, etc) if (!resultTag.contains(TheurgyConstants.Nbt.Divination.LINKED_BLOCK_ID)) { - ResourceLocation sourceId = null; + String sourceId = null; for (var ingredient : this.getIngredients()) { var json = ingredient.toJson(); if (json instanceof JsonObject jsonObj && jsonObj.has("nbt")) { var ingredientTag = CraftingHelper.getNBT(jsonObj.get("nbt")); if (ingredientTag.contains(TheurgyConstants.Nbt.SULFUR_SOURCE_ID)) { - sourceId = new ResourceLocation(ingredientTag.getString(TheurgyConstants.Nbt.SULFUR_SOURCE_ID)); + sourceId = ingredientTag.getString(TheurgyConstants.Nbt.SULFUR_SOURCE_ID); break; } } @@ -62,9 +70,9 @@ public ItemStack getResultItem(RegistryAccess registryAccess) { if (sourceId != null) { var translated = this.translateToBlock(sourceId); if (translated != null) { - resultTag.putString(TheurgyConstants.Nbt.Divination.LINKED_BLOCK_ID, translated.toString()); + resultTag.putString(TheurgyConstants.Nbt.Divination.LINKED_BLOCK_ID, translated); } else { - resultTag.putString(TheurgyConstants.Nbt.Divination.LINKED_BLOCK_ID, sourceId.toString()); + resultTag.putString(TheurgyConstants.Nbt.Divination.LINKED_BLOCK_ID, sourceId); } //we also set the preview mode, to allow the assemble() method to override based on the actual input. resultTag.putBoolean(TheurgyConstants.Nbt.Divination.LINKED_BLOCK_ID_PREVIEW_MODE, true); @@ -78,47 +86,94 @@ public ItemStack getResultItem(RegistryAccess registryAccess) { public ItemStack assemble(CraftingContainer pInv, RegistryAccess registryAccess) { var result = this.getResultItem(registryAccess).copy(); - var resultTag = result.getOrCreateTag(); - //if the recipe already has a linked block, we don't need to do the translation stuff. //if that linked block is only a preview (coming from getResultItem(), used mainly for correct display in JEI), // we have to ignore it and translate after all if (!resultTag.contains(TheurgyConstants.Nbt.Divination.LINKED_BLOCK_ID) || resultTag.getBoolean(TheurgyConstants.Nbt.Divination.LINKED_BLOCK_ID_PREVIEW_MODE) ) { + //check pInv for ingredients with sulfur source id, if so, find the appropriate block id based on it and set it on the result item - ResourceLocation sourceId = null; + String sourceId = null; for (int i = 0; i < pInv.getContainerSize(); i++) { var stack = pInv.getItem(i); if (stack.hasTag()) { var tag = stack.getTag(); if (tag.contains(TheurgyConstants.Nbt.SULFUR_SOURCE_ID)) { - sourceId = new ResourceLocation(tag.getString(TheurgyConstants.Nbt.SULFUR_SOURCE_ID)); + sourceId = tag.getString(TheurgyConstants.Nbt.SULFUR_SOURCE_ID); break; } } } if (sourceId != null) { - var translated = this.translateToBlock(sourceId); + var translated = sourceId.startsWith("#") ? this.translateTagToBlock(sourceId) : this.translateToBlock(sourceId); if (translated != null) { - resultTag.putString(TheurgyConstants.Nbt.Divination.LINKED_BLOCK_ID, translated.toString()); + resultTag.putString(TheurgyConstants.Nbt.Divination.LINKED_BLOCK_ID, translated); } else { - resultTag.putString(TheurgyConstants.Nbt.Divination.LINKED_BLOCK_ID, sourceId.toString()); + resultTag.putString(TheurgyConstants.Nbt.Divination.LINKED_BLOCK_ID, sourceId); } } } - return super.assemble(pInv, registryAccess); + return result; } - public ResourceLocation translateToBlock(ResourceLocation sourceId) { + public String translateTagToBlock(String sourceTag) { //first we check if we have a manual override mapping - var mapped = ServerConfig.get().recipes.sulfurSourceToBlockMapping.get().get(sourceId.toString()); + var mapped = ServerConfig.get().recipes.sulfurSourceToBlockMapping.get().get(sourceTag); if (mapped != null) - return new ResourceLocation(mapped); + return mapped; + + //if not we use generic logic to translate ingot, storage block, nugget, raw, ore, dust to (ore)block. + //even though likely not all of these will be used to create sulfur its good to handle them. + + //examples: + //target is forge:ores/iron + //forge:ingots/iron + //forge:nuggets/iron + //forge:raw_materials/iron + //forge:dusts/iron + //forge:storage_blocks/iron + //forge:gems/iron + + //special handling for coal items as they are none of the above + if (sourceTag.equals("#minecraft:coals")) + return "#forge:ores/coal"; + + var parts = sourceTag.split(":"); + var namespace = parts[0]; + var path = parts[1]; + var translatedPath = path; + if (path.contains("ingots/")) { + translatedPath = path.replace("ingots/", "ores/"); + } else if (path.contains("nuggets/")) { + translatedPath = path.replace("nuggets/", "ores/"); + } else if (path.contains("raw_materials/")) { + translatedPath = path.replace("raw_materials/", "ores/"); + } else if (path.contains("dusts/")) { + translatedPath = path.replace("dusts/", "ores/"); + } else if (path.contains("storage_blocks/")) { + translatedPath = translatedPath.replace("storage_blocks/", "ores/"); + } else if (path.contains("gems/")) { + translatedPath = translatedPath.replace("gems/", "ores/"); + } + + var translatedTag = new ResourceLocation(namespace.substring(1) + ":" + translatedPath); + if (ForgeRegistries.BLOCKS.tags().getTag(TagKey.create(Registries.BLOCK, translatedTag)).isBound()) + return "#" + translatedTag; + + Theurgy.LOGGER.warn("Could not find an appropriate block tag for sulfur source ttag: " + sourceTag + ", tried tag: #" + translatedTag); + return null; + } + + public String translateToBlock(String sourceId) { + //first we check if we have a manual override mapping + var mapped = ServerConfig.get().recipes.sulfurSourceToBlockMapping.get().get(sourceId); + if (mapped != null) + return mapped; //if not we use generic logic to translate ingot, storage block, nugget, raw, ore, dust to (ore)block. //even though likely not all of these will be used to create sulfur its good to handle them. @@ -131,8 +186,9 @@ public ResourceLocation translateToBlock(ResourceLocation sourceId) { //deepslate_iron_ore //iron_dust //iron_block - - var path = sourceId.getPath(); + var parts = sourceId.split(":"); + var namespace = parts[0]; + var path = parts[1]; var translatedPath = path; if (path.contains("raw_")) { translatedPath = path.replace("raw_", ""); @@ -152,16 +208,15 @@ public ResourceLocation translateToBlock(ResourceLocation sourceId) { } translatedPath = translatedPath + "_ore"; - var translated = new ResourceLocation(sourceId.getNamespace(), translatedPath); - - if (ForgeRegistries.BLOCKS.containsKey(translated)) { - return translated; + var translatedRL = new ResourceLocation(namespace + ":" + translatedPath); + if (ForgeRegistries.BLOCKS.containsKey(translatedRL)) { + return translatedRL.toString(); } - if (!ForgeRegistries.BLOCKS.containsKey(translated)) { - var fallback = ForgeRegistries.BLOCKS.getKeys().stream().filter(x -> x.getPath().equals(translated.getPath())).findFirst(); + if (!ForgeRegistries.BLOCKS.containsKey(translatedRL)) { + var fallback = ForgeRegistries.BLOCKS.getKeys().stream().filter(x -> x.getPath().equals(translatedRL.getPath())).findFirst(); if (fallback.isPresent()) { - return fallback.get(); + return fallback.get().toString(); } } @@ -171,18 +226,23 @@ public ResourceLocation translateToBlock(ResourceLocation sourceId) { public static class Serializer implements RecipeSerializer { + @Override public DivinationRodRecipe fromJson(ResourceLocation pRecipeId, JsonObject pJson) { var shapedRecipe = RecipeSerializer.SHAPED_RECIPE.fromJson(pRecipeId, pJson); + //we can use null here because the shaped recipe does not use the registry access return new DivinationRodRecipe(pRecipeId, shapedRecipe.getGroup(), shapedRecipe.getWidth(), shapedRecipe.getHeight(), shapedRecipe.getIngredients(), shapedRecipe.getResultItem(RegistryAccess.EMPTY)); } + @Override public DivinationRodRecipe fromNetwork(ResourceLocation pRecipeId, FriendlyByteBuf pBuffer) { var shapedRecipe = RecipeSerializer.SHAPED_RECIPE.fromNetwork(pRecipeId, pBuffer); + //we can use null here because the shaped recipe does not use the registry access return new DivinationRodRecipe(pRecipeId, shapedRecipe.getGroup(), shapedRecipe.getWidth(), shapedRecipe.getHeight(), shapedRecipe.getIngredients(), shapedRecipe.getResultItem(RegistryAccess.EMPTY)); } + @Override public void toNetwork(FriendlyByteBuf pBuffer, DivinationRodRecipe pRecipe) { RecipeSerializer.SHAPED_RECIPE.toNetwork(pBuffer, pRecipe); } diff --git a/src/main/java/com/klikli_dev/theurgy/content/recipe/IncubationRecipe.java b/src/main/java/com/klikli_dev/theurgy/content/recipe/IncubationRecipe.java new file mode 100644 index 000000000..abf714c76 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/recipe/IncubationRecipe.java @@ -0,0 +1,165 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.recipe; + +import com.google.gson.JsonObject; +import com.klikli_dev.theurgy.content.recipe.result.RecipeResult; +import com.klikli_dev.theurgy.content.recipe.wrapper.IncubatorRecipeWrapper; +import com.klikli_dev.theurgy.registry.BlockRegistry; +import com.klikli_dev.theurgy.registry.RecipeSerializerRegistry; +import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; +import net.minecraft.core.NonNullList; +import net.minecraft.core.RegistryAccess; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; + +public class IncubationRecipe implements Recipe { + + public static final int DEFAULT_INCUBATION_TIME = 200; + + protected final ResourceLocation id; + protected final Ingredient mercury; + protected final Ingredient salt; + protected final Ingredient sulfur; + + protected final RecipeResult result; + protected final int incubationTime; + + public IncubationRecipe(ResourceLocation pId, Ingredient mercury, Ingredient salt, Ingredient sulfur, RecipeResult pResult, int incubationTime) { + this.id = pId; + this.mercury = mercury; + this.salt = salt; + this.sulfur = sulfur; + this.result = pResult; + this.incubationTime = incubationTime; + } + + @Override + public boolean isSpecial() { + return true; + } + + @Override + public ResourceLocation getId() { + return this.id; + } + + @Override + public RecipeType getType() { + return RecipeTypeRegistry.INCUBATION.get(); + } + + @Override + public boolean matches(IncubatorRecipeWrapper pContainer, Level pLevel) { + return this.mercury.test(pContainer.getMercuryVesselInv().getStackInSlot(0)) && + this.salt.test(pContainer.getSaltVesselInv().getStackInSlot(0)) && + this.sulfur.test(pContainer.getSulfurVesselInv().getStackInSlot(0)); + } + + @Override + public ItemStack assemble(IncubatorRecipeWrapper pInv, RegistryAccess registryAccess) { + return this.result.getStack().copy(); + } + + @Override + public boolean canCraftInDimensions(int pWidth, int pHeight) { + return true; + } + + @Override + public ItemStack getResultItem(RegistryAccess registryAccess) { + return this.result.getStack(); + } + + public RecipeResult getResult() { + return this.result; + } + + @Override + public NonNullList getIngredients() { + NonNullList nonnulllist = NonNullList.create(); + nonnulllist.add(this.mercury); + nonnulllist.add(this.salt); + nonnulllist.add(this.sulfur); + return nonnulllist; + } + + @Override + public ItemStack getToastSymbol() { + return new ItemStack(BlockRegistry.INCUBATOR.get()); + } + + @Override + public RecipeSerializer getSerializer() { + return RecipeSerializerRegistry.INCUBATION.get(); + } + + public int getIncubationTime() { + return this.incubationTime; + } + + public Ingredient getMercury() { + return this.mercury; + } + + public Ingredient getSalt() { + return this.salt; + } + + public Ingredient getSulfur() { + return this.sulfur; + } + + public static class Serializer implements RecipeSerializer { + + @Override + public IncubationRecipe fromJson(ResourceLocation pRecipeId, JsonObject pJson) { + var mercuryElement = GsonHelper.isArrayNode(pJson, "mercury") ? + GsonHelper.getAsJsonArray(pJson, "mercury") : GsonHelper.getAsJsonObject(pJson, "mercury"); + var mercury = Ingredient.fromJson(mercuryElement); + + var saltElement = GsonHelper.isArrayNode(pJson, "salt") ? + GsonHelper.getAsJsonArray(pJson, "salt") : GsonHelper.getAsJsonObject(pJson, "salt"); + var salt = Ingredient.fromJson(saltElement); + + var sulfurElement = GsonHelper.isArrayNode(pJson, "sulfur") ? + GsonHelper.getAsJsonArray(pJson, "sulfur") : GsonHelper.getAsJsonObject(pJson, "sulfur"); + var sulfur = Ingredient.fromJson(sulfurElement); + + var result = RecipeResult.fromJson(GsonHelper.getAsJsonObject(pJson, "result")); + + var incubationTime = GsonHelper.getAsInt(pJson, "incubation_time", DEFAULT_INCUBATION_TIME); + return new IncubationRecipe(pRecipeId, mercury, salt, sulfur, result, incubationTime); + } + + @Override + public IncubationRecipe fromNetwork(ResourceLocation pRecipeId, FriendlyByteBuf pBuffer) { + var mercury = Ingredient.fromNetwork(pBuffer); + var salt = Ingredient.fromNetwork(pBuffer); + var sulfur = Ingredient.fromNetwork(pBuffer); + var result = RecipeResult.fromNetwork(pBuffer); + var incubationTime = pBuffer.readVarInt(); + return new IncubationRecipe(pRecipeId, mercury, salt, sulfur, result, incubationTime); + } + + @Override + public void toNetwork(FriendlyByteBuf pBuffer, IncubationRecipe pRecipe) { + pRecipe.mercury.toNetwork(pBuffer); + pRecipe.salt.toNetwork(pBuffer); + pRecipe.sulfur.toNetwork(pBuffer); + pRecipe.result.toNetwork(pBuffer); + pBuffer.writeVarInt(pRecipe.incubationTime); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/klikli_dev/theurgy/content/recipe/LiquefactionRecipe.java b/src/main/java/com/klikli_dev/theurgy/content/recipe/LiquefactionRecipe.java new file mode 100644 index 000000000..93b30c22f --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/recipe/LiquefactionRecipe.java @@ -0,0 +1,171 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.recipe; + +import com.google.gson.JsonObject; +import com.klikli_dev.theurgy.TheurgyConstants; +import com.klikli_dev.theurgy.content.item.AlchemicalSulfurItem; +import com.klikli_dev.theurgy.content.recipe.ingredient.FluidIngredient; +import com.klikli_dev.theurgy.content.recipe.wrapper.RecipeWrapperWithFluid; +import com.klikli_dev.theurgy.registry.BlockRegistry; +import com.klikli_dev.theurgy.registry.RecipeSerializerRegistry; +import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; +import net.minecraft.core.NonNullList; +import net.minecraft.core.RegistryAccess; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.Level; +import net.minecraftforge.common.crafting.CraftingHelper; +import net.minecraftforge.registries.ForgeRegistries; + +public class LiquefactionRecipe implements Recipe { + + public static final int DEFAULT_LIQUEFACTION_TIME = 200; + protected final ResourceLocation id; + protected final Ingredient ingredient; + protected final FluidIngredient solvent; + protected final ItemStack result; + protected final int liquefactionTime; + + public LiquefactionRecipe(ResourceLocation pId, Ingredient pIngredient, FluidIngredient pSolvent, ItemStack pResult, int liquefactionTime) { + this.id = pId; + this.ingredient = pIngredient; + this.solvent = pSolvent; + this.result = pResult; + this.liquefactionTime = liquefactionTime; + } + + @Override + public boolean isSpecial() { + return true; + } + + @Override + public ResourceLocation getId() { + return this.id; + } + + @Override + public RecipeType getType() { + return RecipeTypeRegistry.LIQUEFACTION.get(); + } + + @Override + public boolean matches(RecipeWrapperWithFluid pContainer, Level pLevel) { + return this.ingredient.test(pContainer.getItem(0)) && this.solvent.test(pContainer.getTank().getFluidInTank(0)); + } + + @Override + public ItemStack assemble(RecipeWrapperWithFluid pInv, RegistryAccess registryAccess) { + return this.result.copy(); + } + + @Override + public boolean canCraftInDimensions(int pWidth, int pHeight) { + return true; + } + + @Override + public ItemStack getResultItem(RegistryAccess registryAccess) { + return this.result; + } + + @Override + public NonNullList getIngredients() { + NonNullList nonnulllist = NonNullList.create(); + nonnulllist.add(this.ingredient); + return nonnulllist; + } + + @Override + public ItemStack getToastSymbol() { + return new ItemStack(BlockRegistry.LIQUEFACTION_CAULDRON.get()); + } + + @Override + public RecipeSerializer getSerializer() { + return RecipeSerializerRegistry.LIQUEFACTION.get(); + } + + public int getLiquefactionTime() { + return this.liquefactionTime; + } + + public FluidIngredient getSolvent() { + return this.solvent; + } + + public Ingredient getIngredient() { + return this.ingredient; + } + + public static class Serializer implements RecipeSerializer { + + @Override + public LiquefactionRecipe fromJson(ResourceLocation pRecipeId, JsonObject pJson) { + var ingredientElement = GsonHelper.isArrayNode(pJson, "ingredient") ? GsonHelper.getAsJsonArray(pJson, "ingredient") : GsonHelper.getAsJsonObject(pJson, "ingredient"); + var ingredient = Ingredient.fromJson(ingredientElement); + + var solventElement = GsonHelper.isArrayNode(pJson, "solvent") ? GsonHelper.getAsJsonArray(pJson, "solvent") : GsonHelper.getAsJsonObject(pJson, "solvent"); + var solvent = FluidIngredient.fromJson(solventElement); + + ItemStack result = CraftingHelper.getItemStack(GsonHelper.getAsJsonObject(pJson, "result"), true, true); + + int liquefactionTime = GsonHelper.getAsInt(pJson, "liquefaction_time", DEFAULT_LIQUEFACTION_TIME); + + result = this.fixSourceIdIfNecessary(result, ingredient); + + return new LiquefactionRecipe(pRecipeId, ingredient, solvent, result, liquefactionTime); + } + + public ItemStack fixSourceIdIfNecessary(ItemStack resultItem, Ingredient ingredient) { + if (resultItem.getItem() instanceof AlchemicalSulfurItem sulfur + && sulfur.autoGenerateSourceIdInRecipe + && AlchemicalSulfurItem.getSourceStack(resultItem).isEmpty()) { + + var modified = resultItem.copy(); + + if (ingredient.values.length > 0) { + if (ingredient.values[0] instanceof Ingredient.TagValue tagValue) { + modified.getOrCreateTag().putString(TheurgyConstants.Nbt.SULFUR_SOURCE_ID, "#" + tagValue.tag.location()); + return modified; + } else if (ingredient.values[0] instanceof Ingredient.ItemValue itemValue) { + modified.getOrCreateTag().putString(TheurgyConstants.Nbt.SULFUR_SOURCE_ID, + ForgeRegistries.ITEMS.getKey(itemValue.getItems().stream().findFirst().get().getItem()).toString()); + return modified; + } + } + + throw new IllegalArgumentException("AlchemicalSulfurItem " + resultItem + " is configured to generate source id in recipe, but Ingredient.values[0] is not a tag or item value so we don't know how to get the source."); + } + return resultItem; + } + + @Override + public LiquefactionRecipe fromNetwork(ResourceLocation pRecipeId, FriendlyByteBuf pBuffer) { + var ingredient = Ingredient.fromNetwork(pBuffer); + var solvent = FluidIngredient.fromNetwork(pBuffer); + var result = pBuffer.readItem(); + var liquefactionTime = pBuffer.readVarInt(); + return new LiquefactionRecipe(pRecipeId, ingredient, solvent, result, liquefactionTime); + } + + @Override + public void toNetwork(FriendlyByteBuf pBuffer, LiquefactionRecipe pRecipe) { + pRecipe.ingredient.toNetwork(pBuffer); + pRecipe.solvent.toNetwork(pBuffer); //Ingredient.toNetwork(pBuffer); should suffice here as it redirects to the serializer registry anyway + pBuffer.writeItem(pRecipe.result); + pBuffer.writeVarInt(pRecipe.liquefactionTime); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/klikli_dev/theurgy/content/recipe/ingredient/FluidIngredient.java b/src/main/java/com/klikli_dev/theurgy/content/recipe/ingredient/FluidIngredient.java new file mode 100644 index 000000000..920a989ba --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/recipe/ingredient/FluidIngredient.java @@ -0,0 +1,312 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.recipe.ingredient; + +import com.google.common.collect.ImmutableList; +import com.google.gson.*; +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; +import com.mojang.serialization.DynamicOps; +import com.mojang.serialization.JsonOps; +import com.mojang.serialization.codecs.PrimitiveCodec; +import it.unimi.dsi.fastutil.ints.IntList; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.Fluids; +import net.minecraftforge.common.crafting.IIngredientSerializer; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.registries.ForgeRegistries; + +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Comparator; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +public class FluidIngredient extends Ingredient { + + public static final FluidIngredient EMPTY = new FluidIngredient(Stream.empty()); + public static final Codec CODEC = new PrimitiveCodec<>() { + @Override + public DataResult read(DynamicOps ops, T input) { + try { + return DataResult.success(FluidIngredient.fromJson(ops.convertTo(JsonOps.INSTANCE, input))); + } catch (JsonParseException e) { + return DataResult.error(() -> "Failed to parse Ingredient: " + e.getMessage()); + } + } + + @Override + public T write(DynamicOps ops, FluidIngredient value) { + return JsonOps.INSTANCE.convertTo(ops, value.toJson()); + } + }; + private final Value[] values; + + @Nullable + private FluidStack[] fluidStacks; + + private int amount = -1; + + protected FluidIngredient(Stream pValues) { + super(Stream.empty()); + + this.values = pValues.toArray(Value[]::new); + } + + public static FluidIngredient ofFluid() { + return EMPTY; + } + + public static FluidIngredient ofFluid(int amount, Fluid... pItems) { + return ofFluid(Arrays.stream(pItems).map(f -> new FluidStack(f, amount))); + } + + public static FluidIngredient ofFluid(FluidStack... pStacks) { + return ofFluid(Arrays.stream(pStacks)); + } + + public static FluidIngredient ofFluid(Stream pStacks) { + return fromFluidValues(pStacks.filter((p_43944_) -> { + return !p_43944_.isEmpty(); + }).map(FluidValue::new)); + } + + public static FluidIngredient ofFluid(TagKey pTag, int amount) { + return fromFluidValues(Stream.of(new TagValue(pTag, amount))); + } + + public static FluidIngredient fromFluidValues(Stream pStream) { + var ingredient = new FluidIngredient(pStream); + return ingredient.isEmpty() ? EMPTY : ingredient; + } + + public static FluidIngredient fromJson(@Nullable JsonElement pJson) { + if (pJson != null && !pJson.isJsonNull()) { + if (pJson.isJsonObject()) { + return fromFluidValues(Stream.of(fluidValueFromJson(pJson.getAsJsonObject()))); + } else if (pJson.isJsonArray()) { + JsonArray jsonarray = pJson.getAsJsonArray(); + if (jsonarray.size() == 0) { + throw new JsonSyntaxException("Fluid array cannot be empty, at least one item must be defined"); + } else { + return fromFluidValues(StreamSupport.stream(jsonarray.spliterator(), false).map((p_151264_) -> { + return fluidValueFromJson(GsonHelper.convertToJsonObject(p_151264_, "fluid")); + })); + } + } else { + throw new JsonSyntaxException("Expected fluid to be object or array of objects"); + } + } else { + throw new JsonSyntaxException("Item cannot be null"); + } + } + + public static FluidIngredient fromNetwork(FriendlyByteBuf pBuffer) { + var size = pBuffer.readVarInt(); + if (size == -1) + throw new UnsupportedOperationException("FluidIngredients should never be serialized with size -1!"); + return fromFluidValues(Stream.generate(() -> new FluidValue(pBuffer.readFluidStack())).limit(size)); + } + + public static FluidIngredient.Value fluidValueFromJson(JsonObject pJson) { + if (!pJson.has("amount")) { + throw new JsonParseException("A fluid ingredient entry must have an amount"); + } + var amount = GsonHelper.getAsInt(pJson, "amount"); + + if (pJson.has("fluid") && pJson.has("tag")) { + throw new JsonParseException("A fluid ingredient entry is either a tag or a fluid, not both"); + } else if (pJson.has("fluid")) { + var fluid = fluidFromJson(pJson); + return new FluidValue(new FluidStack(fluid, amount)); + } else if (pJson.has("tag")) { + ResourceLocation resourcelocation = new ResourceLocation(GsonHelper.getAsString(pJson, "tag")); + TagKey tagkey = TagKey.create(Registries.FLUID, resourcelocation); + return new TagValue(tagkey, amount); + } else { + throw new JsonParseException("A fluid ingredient entry needs either a tag or a fluid"); + } + } + + public static Fluid fluidFromJson(JsonObject pItemObject) { + String s = GsonHelper.getAsString(pItemObject, "fluid"); + var fluid = ForgeRegistries.FLUIDS.getValue(new ResourceLocation(s)); + if (fluid == Fluids.EMPTY) { + throw new JsonSyntaxException("Invalid fluid: " + s); + } else { + return fluid; + } + } + + @Override + protected void invalidate() { + this.invalidate(); + this.fluidStacks = null; + this.amount = -1; + } + + @Override + public boolean isEmpty() { + return this.values.length == 0; + } + + @Override + public IntList getStackingIds() { + return super.getStackingIds(); + } + + @Override + public ItemStack[] getItems() { + return super.getItems(); //will be empty + } + + public FluidStack[] getFluids() { + if (this.fluidStacks == null) { + this.fluidStacks = Arrays.stream(this.values).flatMap((value) -> value.getFluids().stream()).distinct().toArray(FluidStack[]::new); + } + + return this.fluidStacks; + } + + public int getAmount() { + if (this.amount == -1) { + var fluids = this.getFluids(); + this.amount = fluids.length == 0 ? 0 : Arrays.stream(this.getFluids()).max(Comparator.comparingInt(FluidStack::getAmount)).get().getAmount(); + } + return this.amount; + } + + @Override + public boolean test(@Nullable ItemStack pStack) { + return false; + } + + @Override + public JsonElement toJson() { + if (this.values.length == 1) { + return this.values[0].serialize(); + } else { + JsonArray jsonarray = new JsonArray(); + + for (Value value : this.values) { + jsonarray.add(value.serialize()); + } + + return jsonarray; + } + } + + public boolean test(FluidStack fluidStack) { + if (fluidStack == null) { + return false; + } else if (this.isEmpty()) { + return fluidStack.isEmpty(); + } else { + for (var fluid : this.getFluids()) { + //Fluid ingredients need to test for amounts too, hence the containsFluid + if (fluidStack.containsFluid(fluid)) { + return true; + } + } + return false; + } + } + + @Override + public IIngredientSerializer getSerializer() { + return Serializer.INSTANCE; + } + + public interface Value { + Collection getFluids(); + + JsonObject serialize(); + } + + public static class FluidValue implements Value { + private final FluidStack fluid; + + public FluidValue(FluidStack fluid) { + this.fluid = fluid; + } + + @Override + public Collection getFluids() { + return ImmutableList.of(this.fluid); + } + + @Override + public JsonObject serialize() { + JsonObject jsonobject = new JsonObject(); + jsonobject.addProperty("fluid", ForgeRegistries.FLUIDS.getKey(this.fluid.getFluid()).toString()); + jsonobject.addProperty("amount", this.fluid.getAmount()); + return jsonobject; + } + } + + public static class TagValue implements Value { + private final TagKey tag; + + private final int amount; + + public TagValue(TagKey pTag, int amount) { + this.tag = pTag; + this.amount = amount; + } + + @Override + public Collection getFluids() { + var list = new ArrayList(); + + ForgeRegistries.FLUIDS.tags().getTag(this.tag).stream().forEach(fluid -> list.add(new FluidStack(fluid, this.amount))); + + //Note: Item stacks here add a barrier with custom hover name, we just leave the list empty, should be OK. + return list; + } + + @Override + public JsonObject serialize() { + JsonObject jsonobject = new JsonObject(); + jsonobject.addProperty("tag", this.tag.location().toString()); + jsonobject.addProperty("amount", this.amount); + return jsonobject; + } + } + + public static class Serializer implements IIngredientSerializer { + + public static final Serializer INSTANCE = new Serializer(); + + @Override + public FluidIngredient parse(FriendlyByteBuf buffer) { + return FluidIngredient.fromFluidValues(Stream.generate(() -> new FluidValue(buffer.readFluidStack())).limit(buffer.readVarInt())); + } + + @Override + public FluidIngredient parse(JsonObject json) { + return FluidIngredient.fromFluidValues(Stream.of(FluidIngredient.fluidValueFromJson(json))); + } + + @Override + public void write(FriendlyByteBuf buffer, FluidIngredient ingredient) { + FluidStack[] fluids = ingredient.getFluids(); + buffer.writeVarInt(fluids.length); + + for (FluidStack stack : fluids) + buffer.writeFluidStack(stack); + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/recipe/ingredient/FluidTagEmptyCondition.java b/src/main/java/com/klikli_dev/theurgy/content/recipe/ingredient/FluidTagEmptyCondition.java new file mode 100644 index 000000000..cef4de585 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/recipe/ingredient/FluidTagEmptyCondition.java @@ -0,0 +1,68 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.recipe.ingredient; + +import com.google.gson.JsonObject; +import com.klikli_dev.theurgy.Theurgy; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.level.material.Fluid; +import net.minecraftforge.common.crafting.conditions.ICondition; +import net.minecraftforge.common.crafting.conditions.IConditionSerializer; + +public class FluidTagEmptyCondition implements ICondition { + private static final ResourceLocation NAME = Theurgy.loc("fluid_tag_empty"); + private final TagKey tag; + + public FluidTagEmptyCondition(String location) { + this(new ResourceLocation(location)); + } + + public FluidTagEmptyCondition(String namespace, String path) { + this(new ResourceLocation(namespace, path)); + } + + public FluidTagEmptyCondition(ResourceLocation tag) { + this.tag = TagKey.create(Registries.FLUID, tag); + } + + @Override + public ResourceLocation getID() { + return NAME; + } + + @Override + public boolean test(ICondition.IContext context) { + return context.getTag(this.tag).isEmpty(); + } + + @Override + public String toString() { + return "fluid_tag_empty(\"" + this.tag.location() + "\")"; + } + + public static class Serializer implements IConditionSerializer { + public static final FluidTagEmptyCondition.Serializer INSTANCE = new FluidTagEmptyCondition.Serializer(); + + @Override + public void write(JsonObject json, FluidTagEmptyCondition value) { + json.addProperty("tag", value.tag.location().toString()); + } + + @Override + public FluidTagEmptyCondition read(JsonObject json) { + return new FluidTagEmptyCondition(new ResourceLocation(GsonHelper.getAsString(json, "tag"))); + } + + @Override + public ResourceLocation getID() { + return FluidTagEmptyCondition.NAME; + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/recipe/result/ItemRecipeResult.java b/src/main/java/com/klikli_dev/theurgy/content/recipe/result/ItemRecipeResult.java new file mode 100644 index 000000000..f62d8444f --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/recipe/result/ItemRecipeResult.java @@ -0,0 +1,50 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.recipe.result; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; + +/** + * A tag result for recipes that use tags as output. + */ +public class ItemRecipeResult extends RecipeResult { + + public static byte TYPE = 0; + + private final ItemStack stack; + + @Nullable + private ItemStack[] cachedStacks; + + public ItemRecipeResult(ItemStack stack) { + this.stack = stack; + } + + public static ItemRecipeResult fromNetwork(FriendlyByteBuf pBuffer) { + return new ItemRecipeResult(pBuffer.readItem()); + } + + @Override + public ItemStack getStack() { + return this.stack; + } + + @Override + public ItemStack[] getStacks() { + if (this.cachedStacks == null) { + this.cachedStacks = new ItemStack[]{this.stack}; + } + return this.cachedStacks; + } + + @Override + public byte getType() { + return TYPE; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/recipe/result/RecipeResult.java b/src/main/java/com/klikli_dev/theurgy/content/recipe/result/RecipeResult.java new file mode 100644 index 000000000..054332931 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/recipe/result/RecipeResult.java @@ -0,0 +1,53 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.recipe.result; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.mojang.serialization.JsonOps; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.common.crafting.CraftingHelper; + +public abstract class RecipeResult { + public static RecipeResult fromJson(JsonObject json) { + if (json.has("item")) { + return new ItemRecipeResult(CraftingHelper.getItemStack(json, true, true)); + } else if (json.has("tag")) { + return TagRecipeResult.CODEC.parse(JsonOps.INSTANCE, json).result().get(); + } else { + throw new JsonParseException("RecipeResult must have either an \"tag\" or \"item\" field."); + } + } + + public static RecipeResult fromNetwork(FriendlyByteBuf pBuffer) { + var type = pBuffer.readByte(); + if (type == ItemRecipeResult.TYPE) { + return ItemRecipeResult.fromNetwork(pBuffer); + } else if (type == TagRecipeResult.TYPE) { + return TagRecipeResult.fromNetwork(pBuffer); + } else { + throw new IllegalArgumentException("Unknown recipe result type: " + type); + } + } + + /** + * Get the preferred item stack this result represents. + */ + public abstract ItemStack getStack(); + + /** + * Get all item stacks this result represents. + */ + public abstract ItemStack[] getStacks(); + + public abstract byte getType(); + + public void toNetwork(FriendlyByteBuf pBuffer) { + pBuffer.writeByte(this.getType()); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/recipe/result/TagRecipeResult.java b/src/main/java/com/klikli_dev/theurgy/content/recipe/result/TagRecipeResult.java new file mode 100644 index 000000000..1646fddd5 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/recipe/result/TagRecipeResult.java @@ -0,0 +1,131 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.recipe.result; + +import com.klikli_dev.theurgy.util.TagUtil; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.registries.Registries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Blocks; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.Nullable; + +import java.util.Optional; + +/** + * A tag result for recipes that use tags as output. + */ +public class TagRecipeResult extends RecipeResult { + + public static final Codec CODEC = RecordCodecBuilder.create((builder) -> { + return builder.group( + TagKey.codec(Registries.ITEM).fieldOf("tag").forGetter((getter) -> { + return getter.tag; + }), Codec.INT.fieldOf("count").forGetter((getter) -> { + return getter.count; + }), CompoundTag.CODEC.optionalFieldOf("nbt").forGetter((getter) -> { + return Optional.ofNullable(getter.nbt); + })).apply(builder, TagRecipeResult::new); + }); + public static byte TYPE = 1; + private final TagKey tag; + private final int count; + @Nullable + private final CompoundTag nbt; + + @Nullable + protected ItemStack cachedOutputStack; + + @Nullable + private ItemStack[] cachedStacks; + + public TagRecipeResult(TagKey tag, int count) { + this(tag, count, (CompoundTag) null); + } + + public TagRecipeResult(TagKey tag, int count, @SuppressWarnings("OptionalUsedAsFieldOrParameterType") Optional nbt) { + this(tag, count, nbt.orElse(null)); + } + + public TagRecipeResult(TagKey tag, int count, @Nullable CompoundTag nbt) { + this.tag = tag; + this.count = count; + this.nbt = nbt; + } + + public static TagRecipeResult fromNetwork(FriendlyByteBuf pBuffer) { + var tag = TagKey.create(Registries.ITEM, pBuffer.readResourceLocation()); + var count = pBuffer.readVarInt(); + var nbt = pBuffer.readBoolean() ? pBuffer.readNbt() : null; + return new TagRecipeResult(tag, count, nbt); + } + + public TagKey getTag() { + return this.tag; + } + + public int getCount() { + return this.count; + } + + @Nullable + public CompoundTag getNbt() { + return this.nbt; + } + + public boolean hasNbt() { + return this.nbt != null; + } + + @Override + public ItemStack getStack() { + if (this.cachedOutputStack == null) { + var item = TagUtil.getItemStackForTag(this.tag).copy(); + item.setCount(this.count); + item.setTag(this.nbt); + + if (item.isEmpty()) { + item = new ItemStack(Blocks.BARRIER).setHoverName(Component.literal("Empty Tag: " + this.tag.location())); + } + + this.cachedOutputStack = item; + } + return this.cachedOutputStack; + } + + @Override + public ItemStack[] getStacks() { + if (this.cachedStacks == null) { + //get all items in tag + this.cachedStacks = ForgeRegistries.ITEMS.tags().getTag(this.tag).stream().map(ItemStack::new).toArray(ItemStack[]::new); + } + return this.cachedStacks; + } + + @Override + public byte getType() { + return TYPE; + } + + @Override + public void toNetwork(FriendlyByteBuf pBuffer) { + super.toNetwork(pBuffer); //write type + + pBuffer.writeResourceLocation(this.tag.location()); + pBuffer.writeVarInt(this.count); + pBuffer.writeBoolean(this.nbt != null); + if (this.nbt != null) { + pBuffer.writeNbt(this.nbt); + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/recipe/wrapper/IncubatorRecipeWrapper.java b/src/main/java/com/klikli_dev/theurgy/content/recipe/wrapper/IncubatorRecipeWrapper.java new file mode 100644 index 000000000..a86d355ad --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/recipe/wrapper/IncubatorRecipeWrapper.java @@ -0,0 +1,37 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.recipe.wrapper; + +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.wrapper.CombinedInvWrapper; +import net.minecraftforge.items.wrapper.RecipeWrapper; + +public class IncubatorRecipeWrapper extends RecipeWrapper { + private final IItemHandlerModifiable mercuryVesselInv; + private final IItemHandlerModifiable saltVesselInv; + private final IItemHandlerModifiable sulfurVesselInv; + + public IncubatorRecipeWrapper(IItemHandlerModifiable mercuryVesselInv, IItemHandlerModifiable saltVesselInv, IItemHandlerModifiable sulfurVesselInv) { + super(new CombinedInvWrapper(mercuryVesselInv, saltVesselInv, sulfurVesselInv)); + + this.mercuryVesselInv = mercuryVesselInv; + this.saltVesselInv = saltVesselInv; + this.sulfurVesselInv = sulfurVesselInv; + } + + public IItemHandlerModifiable getMercuryVesselInv() { + return this.mercuryVesselInv; + } + + public IItemHandlerModifiable getSaltVesselInv() { + return this.saltVesselInv; + } + + public IItemHandlerModifiable getSulfurVesselInv() { + return this.sulfurVesselInv; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/recipe/wrapper/RecipeWrapperWithFluid.java b/src/main/java/com/klikli_dev/theurgy/content/recipe/wrapper/RecipeWrapperWithFluid.java new file mode 100644 index 000000000..3fb27e07c --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/recipe/wrapper/RecipeWrapperWithFluid.java @@ -0,0 +1,25 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.recipe.wrapper; + +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.wrapper.RecipeWrapper; + +public class RecipeWrapperWithFluid extends RecipeWrapper { + + private final IFluidHandler tank; + + public RecipeWrapperWithFluid(IItemHandlerModifiable inv, IFluidHandler tank) { + super(inv); + this.tank = tank; + } + + public IFluidHandler getTank() { + return this.tank; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/client/render/BlankEntityRenderer.java b/src/main/java/com/klikli_dev/theurgy/content/render/BlankEntityRenderer.java similarity index 90% rename from src/main/java/com/klikli_dev/theurgy/client/render/BlankEntityRenderer.java rename to src/main/java/com/klikli_dev/theurgy/content/render/BlankEntityRenderer.java index db64dd90c..86eb1283a 100644 --- a/src/main/java/com/klikli_dev/theurgy/client/render/BlankEntityRenderer.java +++ b/src/main/java/com/klikli_dev/theurgy/content/render/BlankEntityRenderer.java @@ -1,10 +1,10 @@ /* - * SPDX-FileCopyrightText: 2022 klikli-dev + * SPDX-FileCopyrightText: 2023 klikli-dev * * SPDX-License-Identifier: MIT */ -package com.klikli_dev.theurgy.client.render; +package com.klikli_dev.theurgy.content.render; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.renderer.MultiBufferSource; diff --git a/src/main/java/com/klikli_dev/theurgy/content/render/FluidRenderer.java b/src/main/java/com/klikli_dev/theurgy/content/render/FluidRenderer.java new file mode 100644 index 000000000..f9e098f71 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/render/FluidRenderer.java @@ -0,0 +1,169 @@ +/* + * SPDX-FileCopyrightText: 2019 simibubi + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.render; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; +import net.minecraft.util.Mth; +import net.minecraft.world.inventory.InventoryMenu; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.phys.Vec3; +import net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidType; + +/** + * See com.simibubi.create.foundation.fluid.FluidRenderer + */ +public class FluidRenderer { + + public static VertexConsumer getFluidBuilder(MultiBufferSource buffer) { + return buffer.getBuffer(RenderTypes.getFluid()); + } + + public static void renderFluidBox(FluidStack fluidStack, float xMin, float yMin, float zMin, float xMax, float yMax, + float zMax, MultiBufferSource buffer, PoseStack ms, int light, boolean renderBottom) { + renderFluidBox(fluidStack, xMin, yMin, zMin, xMax, yMax, zMax, getFluidBuilder(buffer), ms, light, + renderBottom); + } + + public static void renderFluidBox(FluidStack fluidStack, float xMin, float yMin, float zMin, float xMax, float yMax, + float zMax, VertexConsumer builder, PoseStack ms, int light, boolean renderBottom) { + Fluid fluid = fluidStack.getFluid(); + IClientFluidTypeExtensions clientFluid = IClientFluidTypeExtensions.of(fluid); + FluidType fluidAttributes = fluid.getFluidType(); + TextureAtlasSprite fluidTexture = Minecraft.getInstance() + .getTextureAtlas(InventoryMenu.BLOCK_ATLAS) + .apply(clientFluid.getStillTexture(fluidStack)); + + int color = clientFluid.getTintColor(fluidStack); + int blockLightIn = (light >> 4) & 0xF; + int luminosity = Math.max(blockLightIn, fluidAttributes.getLightLevel(fluidStack)); + light = (light & 0xF00000) | luminosity << 4; + + Vec3 center = new Vec3(xMin + (xMax - xMin) / 2, yMin + (yMax - yMin) / 2, zMin + (zMax - zMin) / 2); + ms.pushPose(); + + for (Direction side : Direction.values()) { + if (side == Direction.DOWN && !renderBottom) + continue; + + boolean positive = side.getAxisDirection() == Direction.AxisDirection.POSITIVE; + if (side.getAxis() + .isHorizontal()) { + if (side.getAxis() == Direction.Axis.X) { + renderStillTiledFace(side, zMin, yMin, zMax, yMax, positive ? xMax : xMin, builder, ms, light, + color, fluidTexture); + } else { + renderStillTiledFace(side, xMin, yMin, xMax, yMax, positive ? zMax : zMin, builder, ms, light, + color, fluidTexture); + } + } else { + renderStillTiledFace(side, xMin, zMin, xMax, zMax, positive ? yMax : yMin, builder, ms, light, color, + fluidTexture); + } + } + + ms.popPose(); + } + + public static void renderStillTiledFace(Direction dir, float left, float down, float right, float up, float depth, + VertexConsumer builder, PoseStack ms, int light, int color, TextureAtlasSprite texture) { + FluidRenderer.renderTiledFace(dir, left, down, right, up, depth, builder, ms, light, color, texture, 1); + } + + public static void renderTiledFace(Direction dir, float left, float down, float right, float up, float depth, + VertexConsumer builder, PoseStack ms, int light, int color, TextureAtlasSprite texture, float textureScale) { + boolean positive = dir.getAxisDirection() == Direction.AxisDirection.POSITIVE; + boolean horizontal = dir.getAxis() + .isHorizontal(); + boolean x = dir.getAxis() == Direction.Axis.X; + + float shrink = texture.uvShrinkRatio() * 0.25f * textureScale; + float centerU = texture.getU0() + (texture.getU1() - texture.getU0()) * 0.5f * textureScale; + float centerV = texture.getV0() + (texture.getV1() - texture.getV0()) * 0.5f * textureScale; + + float f; + float x2 = 0; + float y2 = 0; + float u1, u2; + float v1, v2; + for (float x1 = left; x1 < right; x1 = x2) { + f = Mth.floor(x1); + x2 = Math.min(f + 1, right); + if (dir == Direction.NORTH || dir == Direction.EAST) { + f = Mth.ceil(x2); + u1 = texture.getU((f - x2) * 16 * textureScale); + u2 = texture.getU((f - x1) * 16 * textureScale); + } else { + u1 = texture.getU((x1 - f) * 16 * textureScale); + u2 = texture.getU((x2 - f) * 16 * textureScale); + } + u1 = Mth.lerp(shrink, u1, centerU); + u2 = Mth.lerp(shrink, u2, centerU); + for (float y1 = down; y1 < up; y1 = y2) { + f = Mth.floor(y1); + y2 = Math.min(f + 1, up); + if (dir == Direction.UP) { + v1 = texture.getV((y1 - f) * 16 * textureScale); + v2 = texture.getV((y2 - f) * 16 * textureScale); + } else { + f = Mth.ceil(y2); + v1 = texture.getV((f - y2) * 16 * textureScale); + v2 = texture.getV((f - y1) * 16 * textureScale); + } + v1 = Mth.lerp(shrink, v1, centerV); + v2 = Mth.lerp(shrink, v2, centerV); + + if (horizontal) { + if (x) { + putVertex(builder, ms, depth, y2, positive ? x2 : x1, color, u1, v1, dir, light); + putVertex(builder, ms, depth, y1, positive ? x2 : x1, color, u1, v2, dir, light); + putVertex(builder, ms, depth, y1, positive ? x1 : x2, color, u2, v2, dir, light); + putVertex(builder, ms, depth, y2, positive ? x1 : x2, color, u2, v1, dir, light); + } else { + putVertex(builder, ms, positive ? x1 : x2, y2, depth, color, u1, v1, dir, light); + putVertex(builder, ms, positive ? x1 : x2, y1, depth, color, u1, v2, dir, light); + putVertex(builder, ms, positive ? x2 : x1, y1, depth, color, u2, v2, dir, light); + putVertex(builder, ms, positive ? x2 : x1, y2, depth, color, u2, v1, dir, light); + } + } else { + putVertex(builder, ms, x1, depth, positive ? y1 : y2, color, u1, v1, dir, light); + putVertex(builder, ms, x1, depth, positive ? y2 : y1, color, u1, v2, dir, light); + putVertex(builder, ms, x2, depth, positive ? y2 : y1, color, u2, v2, dir, light); + putVertex(builder, ms, x2, depth, positive ? y1 : y2, color, u2, v1, dir, light); + } + } + } + } + + private static void putVertex(VertexConsumer builder, PoseStack ms, float x, float y, float z, int color, float u, + float v, Direction face, int light) { + + Vec3i normal = face.getNormal(); + PoseStack.Pose peek = ms.last(); + int a = color >> 24 & 0xff; + int r = color >> 16 & 0xff; + int g = color >> 8 & 0xff; + int b = color & 0xff; + + builder.vertex(peek.pose(), x, y, z) + .color(r, g, b, a) + .uv(u, v) + .overlayCoords(OverlayTexture.NO_OVERLAY) + .uv2(light) + .normal(peek.normal(), normal.getX(), normal.getY(), normal.getZ()) + .endVertex(); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/content/render/RenderTypes.java b/src/main/java/com/klikli_dev/theurgy/content/render/RenderTypes.java new file mode 100644 index 000000000..399286b67 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/content/render/RenderTypes.java @@ -0,0 +1,33 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.content.render; + +import com.klikli_dev.theurgy.Theurgy; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.VertexFormat; +import net.minecraft.client.renderer.RenderStateShard; +import net.minecraft.client.renderer.RenderType; + +public class RenderTypes extends RenderStateShard { + private static final RenderType FLUID = RenderType.create(Theurgy.loc("fluid").toString(), + DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, false, true, RenderType.CompositeState.builder() + .setShaderState(RENDERTYPE_ENTITY_TRANSLUCENT_CULL_SHADER) + .setTextureState(BLOCK_SHEET_MIPPED) + .setTransparencyState(TRANSLUCENT_TRANSPARENCY) + .setLightmapState(LIGHTMAP) + .setOverlayState(OVERLAY) + .createCompositeState(true)); + + //unneeded + private RenderTypes(String pName, Runnable pSetupState, Runnable pClearState) { + super(pName, pSetupState, pClearState); + } + + public static RenderType getFluid() { + return FLUID; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/DataGenerators.java b/src/main/java/com/klikli_dev/theurgy/datagen/DataGenerators.java deleted file mode 100644 index 76caad8b6..000000000 --- a/src/main/java/com/klikli_dev/theurgy/datagen/DataGenerators.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2022 klikli-dev - * - * SPDX-License-Identifier: MIT - */ - -package com.klikli_dev.theurgy.datagen; - -import com.klikli_dev.theurgy.Theurgy; -import com.klikli_dev.theurgy.datagen.lang.ENUSProvider; -import net.minecraft.data.DataGenerator; -import net.minecraftforge.data.event.GatherDataEvent; - -public class DataGenerators { - - public static void gatherData(GatherDataEvent event) { - DataGenerator generator = event.getGenerator(); - - generator.addProvider(event.includeClient(), new ItemModelsProvider(generator.getPackOutput(), event.getExistingFileHelper())); - generator.addProvider(event.includeClient(), new RecipeProvider(generator.getPackOutput())); - - var enUSProvider = new ENUSProvider(generator.getPackOutput()); - - generator.addProvider(event.includeServer(), new TheurgyBookProvider(generator.getPackOutput(), enUSProvider)); - - //Important: Lang provider (in this case enus) needs to be added after the book provider to process the texts added by the book provider - generator.addProvider(event.includeClient(), enUSProvider); - - } -} \ No newline at end of file diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/ItemModelsProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/ItemModelsProvider.java deleted file mode 100644 index a3b8faba8..000000000 --- a/src/main/java/com/klikli_dev/theurgy/datagen/ItemModelsProvider.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2022 klikli-dev - * - * SPDX-License-Identifier: MIT - */ - -package com.klikli_dev.theurgy.datagen; - -import com.klikli_dev.theurgy.Theurgy; -import com.klikli_dev.theurgy.TheurgyConstants; -import com.klikli_dev.theurgy.registry.ItemRegistry; -import net.minecraft.core.Registry; -import net.minecraft.data.DataGenerator; -import net.minecraft.data.PackOutput; -import net.minecraft.world.item.Item; -import net.minecraftforge.client.model.generators.ItemModelBuilder; -import net.minecraftforge.client.model.generators.ItemModelProvider; -import net.minecraftforge.client.model.generators.ModelFile; -import net.minecraftforge.common.data.ExistingFileHelper; -import net.minecraftforge.registries.ForgeRegistries; - -public class ItemModelsProvider extends ItemModelProvider { - public ItemModelsProvider(PackOutput packOutput, ExistingFileHelper existingFileHelper) { - super(packOutput, Theurgy.MODID, existingFileHelper); - } - - protected String name(Item item) { - return ForgeRegistries.ITEMS.getKey(item).getPath(); - } - - private void registerItemGenerated(String name) { - this.registerItemGenerated(name, name); - } - - private ItemModelBuilder registerItemGenerated(String name, String texture) { - return this.getBuilder(name) - .parent(new ModelFile.UncheckedModelFile("item/generated")) - .texture("layer0", Theurgy.loc("item/" + texture)); - } - - private void registerItemHandheld(String name) { - this.getBuilder(name) - .parent(new ModelFile.UncheckedModelFile("item/handheld")) - .texture("layer0", Theurgy.loc("item/" + name)); - } - - private void registerItemBuiltinEntity(String name) { - this.getBuilder(name) - .parent(new ModelFile.UncheckedModelFile("builtin/entity")); - } - - private void registerDivinationRod(Item divinationRodItem){ - var variant0 = this.registerItemGenerated(this.name(divinationRodItem) + "_0", this.name(divinationRodItem)+ "/divination_rod_0"); - var variant1 =this.registerItemGenerated(this.name(divinationRodItem) + "_1", this.name(divinationRodItem)+ "/divination_rod_1"); - var variant2 =this.registerItemGenerated(this.name(divinationRodItem) + "_2", this.name(divinationRodItem)+ "/divination_rod_2"); - var variant3 =this.registerItemGenerated(this.name(divinationRodItem) + "_3", this.name(divinationRodItem)+ "/divination_rod_3"); - var variant4 =this.registerItemGenerated(this.name(divinationRodItem) + "_4", this.name(divinationRodItem)+ "/divination_rod_4"); - var variant5 =this.registerItemGenerated(this.name(divinationRodItem) + "_5", this.name(divinationRodItem)+ "/divination_rod_5"); - var variant6 =this.registerItemGenerated(this.name(divinationRodItem) + "_6", this.name(divinationRodItem)+ "/divination_rod_6"); - var variant7 = this.registerItemGenerated(this.name(divinationRodItem) + "_7", this.name(divinationRodItem)+ "/divination_rod_7"); - var searchingVariant = this.registerItemGenerated(this.name(divinationRodItem) + "_searching", this.name(divinationRodItem)+ "/divination_rod_searching"); - - var name = this.name(divinationRodItem); - this.getBuilder(name) - .parent(variant0) - - .override() - .model(variant7) - .predicate(TheurgyConstants.ItemProperty.DIVINATION_DISTANCE, 0.0f) - .end() - - .override() - .model(variant6) - .predicate(TheurgyConstants.ItemProperty.DIVINATION_DISTANCE, 1.0f) - .end() - - .override() - .model(variant5) - .predicate(TheurgyConstants.ItemProperty.DIVINATION_DISTANCE, 2.0f) - .end() - - .override() - .model(variant4) - .predicate(TheurgyConstants.ItemProperty.DIVINATION_DISTANCE, 3.0f) - .end() - - .override() - .model(variant3) - .predicate(TheurgyConstants.ItemProperty.DIVINATION_DISTANCE, 4.0f) - .end() - - .override() - .model(variant2) - .predicate(TheurgyConstants.ItemProperty.DIVINATION_DISTANCE, 5.0f) - .end() - - .override() - .model(variant1) - .predicate(TheurgyConstants.ItemProperty.DIVINATION_DISTANCE, 6.0f) - .end() - - .override() - .model(variant0) - .predicate(TheurgyConstants.ItemProperty.DIVINATION_DISTANCE, 7.0f) - .end() - - .override() - .model(searchingVariant) - .predicate(TheurgyConstants.ItemProperty.DIVINATION_DISTANCE, 8.0f) - .end(); - } - - @Override - protected void registerModels() { - this.registerItemGenerated(this.name(ItemRegistry.THE_HERMETICA_ICON.get()), "the_hermetica"); - this.registerItemGenerated(this.name(ItemRegistry.EMPTY_JAR.get())); - this.registerItemGenerated(this.name(ItemRegistry.EMPTY_JAR_LABELED.get())); - this.registerItemGenerated(this.name(ItemRegistry.JAR_LABEL.get())); - this.registerItemBuiltinEntity(this.name(ItemRegistry.ALCHEMICAL_SULFUR.get())); - //this.registerItemGenerated(this.name(ItemRegistry.SULFUR_INGOT.get())); - - this.registerDivinationRod(ItemRegistry.DIVINATION_ROD_T1.get()); - this.registerDivinationRod(ItemRegistry.DIVINATION_ROD_T2.get()); - this.registerDivinationRod(ItemRegistry.DIVINATION_ROD_T3.get()); - this.registerDivinationRod(ItemRegistry.DIVINATION_ROD_T4.get()); - } -} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/RecipeProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/RecipeProvider.java deleted file mode 100644 index 3a6d4a245..000000000 --- a/src/main/java/com/klikli_dev/theurgy/datagen/RecipeProvider.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2022 klikli-dev - * - * SPDX-License-Identifier: MIT - */ - -package com.klikli_dev.theurgy.datagen; - -import net.minecraft.data.DataGenerator; -import net.minecraft.data.PackOutput; -import net.minecraft.data.recipes.FinishedRecipe; - -import java.util.function.Consumer; - -public class RecipeProvider extends net.minecraft.data.recipes.RecipeProvider { - public RecipeProvider(PackOutput packOutput) { - super(packOutput); - } - - @Override - protected void buildRecipes(Consumer pFinishedRecipeConsumer) { - //we need nbt output, so we use a manual json recipe - // ShapedRecipeBuilder.shaped(ItemRegistry.DIVINATION_ROD_T1.get()) -// .define('R', Tags.Items.RODS_WOODEN) -// .define('G', Tags.Items.GLASS) -// .pattern("RGR") -// .pattern("R R") -// .pattern(" R ") -// .unlockedBy("has_wooden_rod", has(Tags.Items.RODS_WOODEN)) //Note: this generates an advancement that we may or may not want. -// .save(pFinishedRecipeConsumer); - } -} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/TheurgyDataGenerators.java b/src/main/java/com/klikli_dev/theurgy/datagen/TheurgyDataGenerators.java new file mode 100644 index 000000000..5b0740646 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/TheurgyDataGenerators.java @@ -0,0 +1,78 @@ +/* + * SPDX-FileCopyrightText: 2022 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.datagen; + +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.datagen.advancement.TheurgyAdvancementSubProvider; +import com.klikli_dev.theurgy.datagen.book.TheurgyBookProvider; +import com.klikli_dev.theurgy.datagen.lang.ENUSProvider; +import com.klikli_dev.theurgy.datagen.loot.TheurgyBlockLootSubProvider; +import com.klikli_dev.theurgy.datagen.model.TheurgyBlockStateProvider; +import com.klikli_dev.theurgy.datagen.model.TheurgyItemModelProvider; +import com.klikli_dev.theurgy.datagen.multiblock.TheurgyMultiblockProvider; +import com.klikli_dev.theurgy.datagen.recipe.*; +import com.klikli_dev.theurgy.datagen.tag.TheurgyBlockTagsProvider; +import com.klikli_dev.theurgy.datagen.tag.TheurgyFluidTagsProvider; +import com.klikli_dev.theurgy.datagen.tag.TheurgyItemTagsProvider; +import com.klikli_dev.theurgy.datagen.worldgen.TheurgyRegistries; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.DataProvider; +import net.minecraft.data.loot.LootTableProvider; +import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; +import net.minecraftforge.common.data.DatapackBuiltinEntriesProvider; +import net.minecraftforge.common.data.ForgeAdvancementProvider; +import net.minecraftforge.data.event.GatherDataEvent; + +import java.util.List; +import java.util.Set; + +public class TheurgyDataGenerators { + + public static void onGatherData(GatherDataEvent event) { + DataGenerator generator = event.getGenerator(); + + var blockTagsProvider = new TheurgyBlockTagsProvider(generator.getPackOutput(), event.getLookupProvider(), event.getExistingFileHelper()); + + generator.addProvider(event.includeServer(), blockTagsProvider); + generator.addProvider(event.includeServer(), new TheurgyFluidTagsProvider(generator.getPackOutput(), event.getLookupProvider(), event.getExistingFileHelper())); + generator.addProvider(event.includeServer(), new TheurgyItemTagsProvider(generator.getPackOutput(), event.getLookupProvider(), blockTagsProvider.contentsGetter(), event.getExistingFileHelper())); + + generator.addProvider(event.includeServer(), + new LootTableProvider(generator.getPackOutput(), Set.of(), List.of( + new LootTableProvider.SubProviderEntry(TheurgyBlockLootSubProvider::new, LootContextParamSets.BLOCK) + ))); + + generator.addProvider(event.includeServer(), + new ForgeAdvancementProvider(generator.getPackOutput(), event.getLookupProvider(), event.getExistingFileHelper(), List.of( + new TheurgyAdvancementSubProvider() + ))); + + generator.addProvider(event.includeClient(), new TheurgyItemModelProvider(generator.getPackOutput(), event.getExistingFileHelper())); + + generator.addProvider(event.includeServer(), new TheurgyBlockStateProvider(generator.getPackOutput(), event.getExistingFileHelper())); + generator.addProvider(event.includeServer(), new ShapedRecipeProvider(generator.getPackOutput())); + generator.addProvider(event.includeServer(), new ShapelessRecipeProvider(generator.getPackOutput())); + generator.addProvider(event.includeServer(), new CalcinationRecipeProvider(generator.getPackOutput())); + generator.addProvider(event.includeServer(), new LiquefactionRecipeProvider(generator.getPackOutput())); + generator.addProvider(event.includeServer(), new DistillationRecipeProvider(generator.getPackOutput())); + generator.addProvider(event.includeServer(), new IncubationRecipeProvider(generator.getPackOutput())); + generator.addProvider(event.includeServer(), new AccumulationRecipeProvider(generator.getPackOutput())); + + generator.addProvider(event.includeServer(), new TheurgyMultiblockProvider(generator.getPackOutput())); + + var enUSProvider = new ENUSProvider(generator.getPackOutput()); + generator.addProvider(event.includeServer(), new TheurgyBookProvider(generator.getPackOutput(), enUSProvider)); + + //Important: Lang provider (in this case enus) needs to be added after the book provider to process the texts added by the book provider + generator.addProvider(event.includeClient(), enUSProvider); + + event.getGenerator().addProvider(event.includeServer(), + (DataProvider.Factory) output -> + new DatapackBuiltinEntriesProvider(output, event.getLookupProvider(), TheurgyRegistries.BUILDER, Set.of(Theurgy.MODID))); + + } +} \ No newline at end of file diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/advancement/TheurgyAdvancementSubProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/advancement/TheurgyAdvancementSubProvider.java new file mode 100644 index 000000000..7fdc109fa --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/advancement/TheurgyAdvancementSubProvider.java @@ -0,0 +1,117 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.datagen.advancement; + +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.registry.ItemRegistry; +import net.minecraft.advancements.Advancement; +import net.minecraft.advancements.CriteriaTriggers; +import net.minecraft.advancements.RequirementsStrategy; +import net.minecraft.advancements.critereon.ContextAwarePredicate; +import net.minecraft.advancements.critereon.InventoryChangeTrigger; +import net.minecraft.advancements.critereon.ItemPredicate; +import net.minecraft.advancements.critereon.PlayerTrigger; +import net.minecraft.core.HolderLookup; +import net.minecraft.resources.ResourceLocation; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.common.data.ForgeAdvancementProvider; + +import java.util.function.Consumer; + +public class TheurgyAdvancementSubProvider implements ForgeAdvancementProvider.AdvancementGenerator { + + protected Consumer saver; + protected HolderLookup.Provider registries; + protected ExistingFileHelper existingFileHelper; + + @Override + public void generate(HolderLookup.Provider registries, Consumer saver, ExistingFileHelper existingFileHelper) { + this.registries = registries; + this.saver = saver; + this.existingFileHelper = existingFileHelper; + this.doGenerate(); + } + + protected void doGenerate() { + var bookRoot = this.add( + Advancement.Builder.advancement() + .addCriterion("theurgy_present", new PlayerTrigger.TriggerInstance(CriteriaTriggers.TICK.getId(), ContextAwarePredicate.ANY)) + .build(this.modLoc("book_root")) + ); + + var hasBasicRod = this.add( + Advancement.Builder.advancement() + .parent(bookRoot) + .requirements(RequirementsStrategy.OR) + .addCriterion("has_t1_rod", InventoryChangeTrigger.TriggerInstance.hasItems(ItemPredicate.Builder.item().of(ItemRegistry.DIVINATION_ROD_T1.get()).build())) + .addCriterion("has_abundant_rod", InventoryChangeTrigger.TriggerInstance.hasItems(ItemPredicate.Builder.item().of(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_ABUNDANT.get()).build())) + .addCriterion("has_common_rod", InventoryChangeTrigger.TriggerInstance.hasItems(ItemPredicate.Builder.item().of(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_COMMON.get()).build())) + .build(this.modLoc("has_basic_rod")) + ); + + var hasAmethystRod = this.add( + Advancement.Builder.advancement() + .parent(bookRoot) + .addCriterion("has_amethyst_rod", InventoryChangeTrigger.TriggerInstance.hasItems(ItemPredicate.Builder.item().of(ItemRegistry.AMETHYST_DIVINATION_ROD.get()).build())) + .build(this.modLoc("has_amethyst_rod")) + ); + + var hasT2Rod = this.add( + Advancement.Builder.advancement() + .parent(bookRoot) + .addCriterion("has_t2_rod", InventoryChangeTrigger.TriggerInstance.hasItems(ItemPredicate.Builder.item().of(ItemRegistry.DIVINATION_ROD_T2.get()).build())) + .build(this.modLoc("has_t2_rod")) + ); + + var hasT3Rod = this.add( + Advancement.Builder.advancement() + .parent(bookRoot) + .addCriterion("has_t3_rod", InventoryChangeTrigger.TriggerInstance.hasItems(ItemPredicate.Builder.item().of(ItemRegistry.DIVINATION_ROD_T3.get()).build())) + .build(this.modLoc("has_t3_rod")) + ); + + var hasT4Rod = this.add( + Advancement.Builder.advancement() + .parent(bookRoot) + .addCriterion("has_t4_rod", InventoryChangeTrigger.TriggerInstance.hasItems(ItemPredicate.Builder.item().of(ItemRegistry.DIVINATION_ROD_T4.get()).build())) + .build(this.modLoc("has_t4_rod")) + ); + + var hasRareRod = this.add( + Advancement.Builder.advancement() + .parent(bookRoot) + .addCriterion("has_rare_rod", InventoryChangeTrigger.TriggerInstance.hasItems(ItemPredicate.Builder.item().of(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_RARE.get()).build())) + .build(this.modLoc("has_rare_rod")) + ); + + var hasPreciousRod = this.add( + Advancement.Builder.advancement() + .parent(bookRoot) + .addCriterion("has_precious_rod", InventoryChangeTrigger.TriggerInstance.hasItems(ItemPredicate.Builder.item().of(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_PRECIOUS.get()).build())) + .build(this.modLoc("has_precious_rod")) + ); + + + var hasLiquefactionCauldron = this.add( + Advancement.Builder.advancement() + .parent(bookRoot) + .addCriterion("has_liquefaction_cauldron", InventoryChangeTrigger.TriggerInstance.hasItems(ItemPredicate.Builder.item().of(ItemRegistry.LIQUEFACTION_CAULDRON.get()).build())) + .build(this.modLoc("has_liquefaction_cauldron")) + ); + + } + + private Advancement add(Advancement advancement) { + this.saver.accept(advancement); + return advancement; + } + + + protected ResourceLocation modLoc(String path) { + return Theurgy.loc(path); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/book/DivinationRodEntryProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/book/DivinationRodEntryProvider.java new file mode 100644 index 000000000..2604fd79a --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/book/DivinationRodEntryProvider.java @@ -0,0 +1,467 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.datagen.book; + +import com.klikli_dev.modonomicon.api.datagen.CategoryEntryMap; +import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; +import com.klikli_dev.modonomicon.api.datagen.book.BookCategoryModel; +import com.klikli_dev.modonomicon.api.datagen.book.BookEntryModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookCraftingRecipePageModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookSpotlightPageModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookTextPageModel; +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.registry.ItemRegistry; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; + +/** + * A dummy provider to separate the generation of divination rod entries from the rest of the getting started category + */ +public class DivinationRodEntryProvider extends CategoryProvider { + + + public DivinationRodEntryProvider(TheurgyBookProvider parent, CategoryEntryMap entryMap) { + super(parent, "dummy"); + + this.entryMap = entryMap; + } + + public TheurgyBookProvider parent() { + return (TheurgyBookProvider) this.parent; + } + + + @Override + protected String[] generateEntryMap() { + throw new UnsupportedOperationException("This is a dummy provider to help generate entries, it should not be used to generate a Category."); + } + + @Override + protected void generateEntries() { + throw new UnsupportedOperationException("This is a dummy provider to help generate entries, it should not be used to generate a Category."); + } + + @Override + protected BookCategoryModel generateCategory() { + throw new UnsupportedOperationException("This is a dummy provider to help generate entries, it should not be used to generate a Category."); + } + + public BookEntryModel aboutDivinationRods(char location) { + this.context().entry("about_divination_rods"); + this.add(this.context().entryName(), "About Divination Rods"); + this.add(this.context().entryDescription(), "An Introduction to Ore-Finding"); + + this.context().page("intro"); + var intro = BookSpotlightPageModel.builder() + .withItem(Ingredient.of(ItemRegistry.DIVINATION_ROD_T1.get())) + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageTitle(), "About Divination Rods"); + this.add(this.context().pageText(), + """ + Divination Rods, also known as Dowsing Rods, are a valuable instrument used to locate ores and other valuable blocks. In order to show the location of a block, it must first be "attuned" to it. + """); + + this.context().page("intro2"); + var intro2 = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "Rod Attunement"); + this.add(this.context().pageText(), + """ + There are two methods of attuning, depending on the type of rod: by *crafting* a rod with the []($PURPLE)alchemical sulfur[](#) of the desired block, or by *using* a rod on the desired block. + \\ + \\ + Attuning a rod to a block will cause it to point towards the nearest block of that type. + """); + + this.context().page("sulfur_attuned_rods"); + var sulfurAttunedRods = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "Pre-Attuned Rods"); + this.add(this.context().pageText(), + """ + Pre-Attuned rods, those that are crafted with alchemical sulfur, are more stable, and thus have a much higher durability, but require more effort to craft. + \\ + \\ + Research {0} (specifically, *Liquefaction*) to continue on this path. + """, this.entryLink("Spagyrics", GettingStartedCategoryProvider.CATEGORY_ID, "spagyrics")); + + + this.context().page("usage"); + var usage = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "Usage"); + this.add(this.context().pageText(), + """ + - **Shift-Click** a block to attune the rod to it (unless it is pre-attuned). + - **Right-Click and hold** to let the rod search for blocks. + - **Right-Click without holding** after a successful search will let the rod show the last found block without consuming durability. + """); + + this.context().page("usage2"); + var usage2 = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "Usage"); + this.add(this.context().pageText(), + """ + The rod will indicate that it found a block by *changing color* to be partially or fully purple, and by emitting a *glowing ball* that will fly towards the block, when right-clicked without holding. + """); + + + return this.entry(location) + .withIcon(ItemRegistry.DIVINATION_ROD_T1.get()) + .withEntryBackground(EntryBackground.DEFAULT) + .withPages( + intro, + intro2, + sulfurAttunedRods, + usage, + usage2 + ); + } + + public BookEntryModel t1DivinationRodEntry(char location) { + this.context().entry("t1_divination_rod"); + this.add(this.context().entryName(), "The Glass Divination Rod"); + this.add(this.context().entryDescription(), "A basic attunable rod for locating abundant and common ores."); + + this.context().page("intro"); + var intro = BookSpotlightPageModel.builder() + .withItem(Ingredient.of(ItemRegistry.DIVINATION_ROD_T1.get())) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageText(), + """ + This divination rod is the most basic variant of attunable rods. It does not require Alchemical Sulfur and can be attuned to a variety of blocks by using it on them, even after it has previously been attuned. However, it has a lower durability than pre-attuned rods. + """); + + this.context().page("supported_blocks"); + var supportedBlocks = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "Attunable Materials"); + this.add(this.context().pageText(), + """ + Rods can be attuned to a wide variety of useful blocks, including various types of ores and wood. Basic divination rods will be sufficient to locate common ores such as {0} or {1}, but more rare and precious materials such as {2} and {3} will require a higher tier rod to detect. + """, + this.itemLink("iron", Items.IRON_ORE), + this.itemLink("coal", Items.COAL_ORE), + this.itemLink("gold", Items.GOLD_ORE), + this.itemLink("diamonds", Items.DIAMOND_ORE) + ); + + this.context().page("recipe"); + var recipe = BookCraftingRecipePageModel.builder() + .withRecipeId1(Theurgy.loc("crafting/shaped/divination_rod_t1")) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageText(), + """ + The most basic tier of divination rods, brittle and limited in it's application, but powerful nonetheless. + """); + + return this.entry(location) + .withIcon(ItemRegistry.DIVINATION_ROD_T1.get()) + .withEntryBackground(EntryBackground.DEFAULT) + .withPages( + intro, + supportedBlocks, + recipe + ); + } + + public BookEntryModel abundantAndCommonSulfurAttunedDivinationRodEntry(char location) { + this.context().entry("abundant_and_common_sulfur_attuned_divination_rod"); + this.add(this.context().entryName(), "Basic Sulfur-Attuned Divination Rods"); + this.add(this.context().entryDescription(), "Pre-attuned rods for locating abundant and common ores."); + + this.context().page("intro"); + var intro = BookSpotlightPageModel.builder() + .withItem(Ingredient.of(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_ABUNDANT.get(), ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_COMMON.get())) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageText(), + """ + This divination rod is the most basic variant of pre-attuned rod. While it cannot be attuned to a new block after crafting, it has a much higher durability, and is generally more convenient to use. + """); + + this.context().page("sulfur"); + var sulfur = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "Sulfur"); + this.add(this.context().pageText(), + """ + To obtain sulfur for crafting this rod you first need to obtain an ore, ingot or gem of the type of material you want the rod to be attuned to. Then, you need to obtain it''s sulfur by melting it down in a {0}. + """, this.entryLink("Liquefaction Cauldron", "spagyrics", "liquefaction_cauldron")); + + + this.context().page("recipe_abundant"); + var recipe_abundant = BookCraftingRecipePageModel.builder() + .withRecipeId1(Theurgy.loc("crafting/shaped/sulfur_attuned_divination_rod_abundant")) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageText(), + """ + A rod pre-attuned to abundant ores, such as {0} or {1}. + """, this.itemLink("copper", Items.COPPER_ORE), this.itemLink("coal", Items.COAL_ORE)); + + this.context().page("recipe_common"); + var recipe_common = BookCraftingRecipePageModel.builder() + .withRecipeId1(Theurgy.loc("crafting/shaped/sulfur_attuned_divination_rod_common")) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageText(), + """ + A rod pre-attuned to common ores, such as {0} or {1}. + """, this.itemLink("iron", Items.IRON_ORE), this.itemLink("lapis", Items.LAPIS_ORE)); + + return this.entry(location) + .withIcon(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_ABUNDANT.get()) + .withEntryBackground(EntryBackground.DEFAULT) + .withPages( + intro, + sulfur, + recipe_abundant, + recipe_common + ); + } + + public BookEntryModel amethystDivinationRodEntry(char location) { + this.context().entry("amethyst_divination_rod"); + this.add(this.context().entryName(), "Amethyst Divination Rod"); + this.add(this.context().entryDescription(), "A pre-attuned rod to find budding amethyst blocks."); + + this.context().page("intro"); + var intro = BookSpotlightPageModel.builder() + .withItem(Ingredient.of(ItemRegistry.AMETHYST_DIVINATION_ROD.get())) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageText(), + """ + Crystals are especially useful for attuning divination rods, and many more advanced rod designs require {0} specifically. This rod is pre-attuned to locate budding amethyst blocks to make it easier to obtain these helpful crystals. + """, this.itemLink("amethyst shards", Items.AMETHYST_SHARD)); + + this.context().page("recipe"); + var recipe = BookCraftingRecipePageModel.builder() + .withRecipeId1(Theurgy.loc("crafting/shaped/amethyst_divination_rod")) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageText(), + """ + A pre-attuned rod that only finds {0}. + """, this.itemLink("amethyst", Items.BUDDING_AMETHYST)); + + return this.entry(location) + .withIcon(ItemRegistry.AMETHYST_DIVINATION_ROD.get()) + .withEntryBackground(EntryBackground.DEFAULT) + .withPages( + intro, + recipe + ); + } + + public BookEntryModel t2DivinationRodEntry(char location) { + this.context().entry("t2_divination_rod"); + this.add(this.context().entryName(), "The Iron Divination Rod"); + this.add(this.context().entryDescription(), "An improved attunable rod for locating rare ores."); + + this.context().page("intro"); + var intro = BookSpotlightPageModel.builder() + .withItem(Ingredient.of(ItemRegistry.DIVINATION_ROD_T2.get())) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageText(), + """ + An improved attunable divination rod to locate higher tier ores, such as {0}. + """, + this.itemLink("gold", Items.GOLD_ORE) + ); + + this.context().page("recipe"); + var recipe = BookCraftingRecipePageModel.builder() + .withRecipeId1(Theurgy.loc("crafting/shaped/divination_rod_t2")) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageText(), + """ + An improved attunable divination rod, more durable and broader in it's application. + """); + + return this.entry(location) + .withIcon(ItemRegistry.DIVINATION_ROD_T2.get()) + .withEntryBackground(EntryBackground.DEFAULT) + .withPages( + intro, + recipe + ); + } + + public BookEntryModel t3DivinationRodEntry(char location) { + this.context().entry("t3_divination_rod"); + this.add(this.context().entryName(), "The Diamond Divination Rod"); + this.add(this.context().entryDescription(), "A superior-grade attunable rod for locating precious ores."); + + this.context().page("intro"); + var intro = BookSpotlightPageModel.builder() + .withItem(Ingredient.of(ItemRegistry.DIVINATION_ROD_T3.get())) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageText(), + """ + A further improved attunable divination rod to locate high tier ores, such as {0}. + """, + this.itemLink("diamond", Items.DIAMOND_ORE) + ); + + this.context().page("recipe"); + var recipe = BookCraftingRecipePageModel.builder() + .withRecipeId1(Theurgy.loc("crafting/shaped/divination_rod_t3")) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageText(), + """ + A further improved attunable divination rod, much more durable and able to detect most ores. + """); + + return this.entry(location) + .withIcon(ItemRegistry.DIVINATION_ROD_T3.get()) + .withEntryBackground(EntryBackground.DEFAULT) + .withPages( + intro, + recipe + ); + } + + public BookEntryModel t4DivinationRodEntry(char location) { + this.context().entry("t4_divination_rod"); + this.add(this.context().entryName(), "The Netherite Divination Rod"); + this.add(this.context().entryDescription(), "A very high durability attunable rod for locating precious ores."); + + this.context().page("intro"); + var intro = BookSpotlightPageModel.builder() + .withItem(Ingredient.of(ItemRegistry.DIVINATION_ROD_T4.get())) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageText(), + """ + The very high durability attunable divination rod to locate ores of any tier, such as {0}. + """, + this.itemLink("diamond", Items.DIAMOND_ORE) + ); + + this.context().page("recipe"); + var recipe = BookCraftingRecipePageModel.builder() + .withRecipeId1(Theurgy.loc("crafting/shaped/divination_rod_t4")) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageText(), + """ + The highest tier attunable divination rod, incredibly durable and able to detect all ores. + """); + + return this.entry(location) + .withIcon(ItemRegistry.DIVINATION_ROD_T4.get()) + .withEntryBackground(EntryBackground.DEFAULT) + .withPages( + intro, + recipe + ); + } + + public BookEntryModel rareSulfurAttunedDivinationRodEntry(char location) { + this.context().entry("rare_sulfur_attuned_divination_rod"); + this.add(this.context().entryName(), "Sulfur-Attuned Divination Rods for Rare Materials"); + this.add(this.context().entryDescription(), "An improved design of Sulfur-Attuned Divination rods, allowing to locate rare ores."); + + this.context().page("intro"); + var intro = BookSpotlightPageModel.builder() + .withItem(Ingredient.of(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_RARE.get())) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageText(), + """ + This divination rod is an improved variant of pre-attuned rod that is more durable allows to locate rare ores, such as {0}. + """, + this.itemLink("gold", Items.GOLD_ORE) + ); + + this.context().page("recipe"); + var recipe = BookCraftingRecipePageModel.builder() + .withRecipeId1(Theurgy.loc("crafting/shaped/sulfur_attuned_divination_rod_rare")) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageText(), + """ + A rod pre-attuned to rare ores, such as {0}. + """, this.itemLink("gold", Items.GOLD_ORE)); + + return this.entry(location) + .withIcon(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_RARE.get()) + .withEntryBackground(EntryBackground.DEFAULT) + .withPages( + intro, + recipe + ); + } + + public BookEntryModel preciousSulfurAttunedDivinationRodEntry(char location) { + this.context().entry("precious_sulfur_attuned_divination_rod"); + this.add(this.context().entryName(), "Sulfur-Attuned Divination Rods for Precious Materials"); + this.add(this.context().entryDescription(), "An intricately crafted Sulfur-Attuned Divination rod, allowing to locate precious ores."); + + this.context().page("intro"); + var intro = BookSpotlightPageModel.builder() + .withItem(Ingredient.of(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_PRECIOUS.get())) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageText(), + """ + This divination rod is the most powerful variant of pre-attuned rod, it is highly durable and allows to locate precious ores, such as {0}. + """, + this.itemLink("diamond", Items.DIAMOND_ORE) + ); + + this.context().page("recipe"); + var recipe = BookCraftingRecipePageModel.builder() + .withRecipeId1(Theurgy.loc("crafting/shaped/sulfur_attuned_divination_rod_precious")) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageText(), + """ + A rod pre-attuned to precious ores, such as {0}. + """, this.itemLink("diamond", Items.DIAMOND_ORE)); + + return this.entry(location) + .withIcon(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_PRECIOUS.get()) + .withEntryBackground(EntryBackground.DEFAULT) + .withPages( + intro, + recipe + ); + } +} \ No newline at end of file diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/book/EntryBackground.java b/src/main/java/com/klikli_dev/theurgy/datagen/book/EntryBackground.java new file mode 100644 index 000000000..b07311748 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/book/EntryBackground.java @@ -0,0 +1,15 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.datagen.book; + +import com.mojang.datafixers.util.Pair; + +public class EntryBackground { + public static final Pair DEFAULT = Pair.of(0, 0); + public static final Pair CATEGORY_START = Pair.of(0, 1); + public static final Pair LINK_TO_CATEGORY = Pair.of(1, 1); +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/book/GettingStartedCategoryProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/book/GettingStartedCategoryProvider.java index b082ab7b0..9680e1605 100644 --- a/src/main/java/com/klikli_dev/theurgy/datagen/book/GettingStartedCategoryProvider.java +++ b/src/main/java/com/klikli_dev/theurgy/datagen/book/GettingStartedCategoryProvider.java @@ -6,239 +6,358 @@ package com.klikli_dev.theurgy.datagen.book; -import com.klikli_dev.modonomicon.api.datagen.BookProvider; import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; import com.klikli_dev.modonomicon.api.datagen.book.BookCategoryModel; import com.klikli_dev.modonomicon.api.datagen.book.BookEntryModel; -import com.klikli_dev.modonomicon.api.datagen.book.page.BookCraftingRecipePageModel; -import com.klikli_dev.modonomicon.api.datagen.book.page.BookSpotlightPageModel; import com.klikli_dev.modonomicon.api.datagen.book.page.BookTextPageModel; import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.registry.BlockRegistry; import com.klikli_dev.theurgy.registry.ItemRegistry; import net.minecraft.world.item.Items; -import net.minecraft.world.item.crafting.Ingredient; public class GettingStartedCategoryProvider extends CategoryProvider { - public GettingStartedCategoryProvider(BookProvider parent) { - super(parent, "getting_started"); + public static final String CATEGORY_ID = "getting_started"; + + public GettingStartedCategoryProvider(TheurgyBookProvider parent) { + super(parent, CATEGORY_ID); + } + + public TheurgyBookProvider parent() { + return (TheurgyBookProvider) this.parent; } @Override protected String[] generateEntryMap() { return new String[]{ "__________________________________", + "__________________ḍ___ď_ḑ_ḓ_______", "__________________________________", - "____________u_____š_______________", + "________________d___ḋ_____________", + "______________________ɖ_ᶑ_________", + "__________________đ_______________", "__________________________________", - "__________i___d___s_______________", + "__________i_a___________ő_ö_______", "__________________________________", - "__________a_______________________", + "______________s_š___o_ó___ô_õ_____", "__________________________________", - "__________________________________" + "______________u_________ò_________" }; } @Override protected void generateEntries() { - var introEntry = this.add(this.makeIntroEntry('i')); - var aboutModEntry = this.add(this.makeAboutModEntry('a')); + var rods = new DivinationRodEntryProvider(this.parent(), this.entryMap()); + var ore = new OreRefiningEntryProvider(this.parent(), this.entryMap()); + + var introEntry = this.add(this.introEntry('i')); + var aboutModEntry = this.add(this.aboutModEntry('a')); + + var aboutDivinationRods = this.add(rods.aboutDivinationRods('d')); + var t1DivinationRod = this.add(rods.t1DivinationRodEntry('ḍ')); + var abundantAndCommonSulfurAttunedDivinationRod = this.add(rods.abundantAndCommonSulfurAttunedDivinationRodEntry('đ')); + + var amethystDivinationRod = this.add(rods.amethystDivinationRodEntry('ḋ')); + var t2DivinationRod = this.add(rods.t2DivinationRodEntry('ď')); + var t3DivinationRod = this.add(rods.t3DivinationRodEntry('ḑ')); + var t4DivinationRod = this.add(rods.t4DivinationRodEntry('ḓ')); + var rareSulfurAttunedDivinationRod = this.add(rods.rareSulfurAttunedDivinationRodEntry('ɖ')); + var preciousSulfurAttunedDivinationRod = this.add(rods.preciousSulfurAttunedDivinationRodEntry('ᶑ')); + + var spagyrics = this.add(this.spagyricsEntry('s')); + var apparatusHowTo = this.add(this.apparatusHowToEntry('u')); + var spagyricsLink = this.add(this.spagyricsLinkEntry('š')); + + var aboutOreRefining = this.add(ore.aboutOreRefiningEntry('o')); + var neededApparatus = this.add(ore.neededApparatusEntry('ó')); + var createSolvent = this.add(ore.createSolventEntry('ő')); + var createSulfur = this.add(ore.createSulfurEntry('ö')); + var createSalt = this.add(ore.createSaltEntry('ô')); + var createMercury = this.add(ore.createMercuryEntry('ò')); + var incubation = this.add(ore.incubationEntry('õ')); + + //links and conditions aboutModEntry.withParent(introEntry); - var divinationRodEntry = this.add(this.makeDivinationRodEntry('d')); - divinationRodEntry.withParent(introEntry); - //TODO: higher tier div rod entries explaining how they work + aboutDivinationRods.withParent(aboutModEntry); + + t1DivinationRod.withParent(aboutDivinationRods); + + abundantAndCommonSulfurAttunedDivinationRod.withParent(aboutDivinationRods); + abundantAndCommonSulfurAttunedDivinationRod.withParent(spagyricsLink); +// abundantAndCommonSulfurAttunedDivinationRod.withCondition( +// this.parent().and( +// this.parent().entryReadCondition(aboutDivinationRods), +// this.parent().advancementCondition(this.modLoc("has_liquefaction_cauldron")) +// ) +// ); + + amethystDivinationRod.withParent(t1DivinationRod); + amethystDivinationRod.withParent(abundantAndCommonSulfurAttunedDivinationRod); +// amethystDivinationRod.withCondition( +// this.parent().and( +// this.parent().or( +// this.parent().entryReadCondition(t1DivinationRod), +// this.parent().entryReadCondition(abundantAndCommonSulfurAttunedDivinationRod) +// ), +// this.parent().advancementCondition(this.modLoc("has_basic_rod") +// ) +// ) +// ); + + t2DivinationRod.withParent(amethystDivinationRod); +// t2DivinationRod.withCondition( +// this.parent().and( +// this.parent().entryReadCondition(amethystDivinationRod), +// this.parent().advancementCondition(this.modLoc("has_amethyst_rod")) +// ) +// ); + + t3DivinationRod.withParent(t2DivinationRod); +// t3DivinationRod.withCondition( +// this.parent().and( +// this.parent().entryReadCondition(t2DivinationRod), +// this.parent().advancementCondition(this.modLoc("has_t2_rod")) +// ) +// ); + + t4DivinationRod.withParent(t3DivinationRod); +// t4DivinationRod.withCondition( +// this.parent().and( +// this.parent().entryReadCondition(t3DivinationRod), +// this.parent().advancementCondition(this.modLoc("has_t3_rod")) +// ) +// ); + + rareSulfurAttunedDivinationRod.withParent(amethystDivinationRod); +// rareSulfurAttunedDivinationRod.withCondition( +// this.parent().and( +// this.parent().entryReadCondition(amethystDivinationRod), +// this.parent().advancementCondition(this.modLoc("has_amethyst_rod")) +// ) +// ); + + preciousSulfurAttunedDivinationRod.withParent(rareSulfurAttunedDivinationRod); +// preciousSulfurAttunedDivinationRod.withCondition( +// this.parent().and( +// this.parent().entryReadCondition(rareSulfurAttunedDivinationRod), +// this.parent().advancementCondition(this.modLoc("has_rare_rod")) +// ) +// ); + + spagyrics.withParent(aboutModEntry); + apparatusHowTo.withParent(spagyrics); + spagyricsLink.withParent(spagyrics); + + aboutOreRefining.withParent(spagyricsLink); + neededApparatus.withParent(aboutOreRefining); + createSolvent.withParent(neededApparatus); + createSulfur.withParent(createSolvent); + createSalt.withParent(neededApparatus); + createMercury.withParent(neededApparatus); + incubation + .withParent(createMercury) + .withParent(createSalt) + .withParent(createSulfur); + + //TODO: Conditions + // amethyst entry should NOT depend on spagyrics -> hence not on abundant sulfur rod } @Override protected BookCategoryModel generateCategory() { this.add(this.context().categoryName(), "Getting Started"); - return BookCategoryModel.create( - Theurgy.loc((this.context().categoryId())), - this.context().categoryName() - ) - .withIcon(ItemRegistry.THE_HERMETICA_ICON.get()); + return BookCategoryModel.create(Theurgy.loc((this.context().categoryId())), this.context().categoryName()).withIcon(ItemRegistry.THE_HERMETICA_ICON.get()).withBackground(Theurgy.loc("textures/gui/book/bg_nightsky.png")); } - - private BookEntryModel makeIntroEntry(char icon) { + private BookEntryModel introEntry(char location) { this.context().entry("intro"); this.add(this.context().entryName(), "About this Work"); this.add(this.context().entryDescription(), "About using The Hermetica"); this.context().page("intro"); - var intro = BookTextPageModel.builder() - .withTitle(this.context().pageTitle()) - .withText(this.context().pageText()) - .build(); + var intro = BookTextPageModel.builder().withTitle(this.context().pageTitle()).withText(this.context().pageText()).build(); this.add(this.context().pageTitle(), "About this Work"); - this.add(this.context().pageText(), - """ - The following pages will lead the novice alchemist on their journey through the noble art of the transformation of matter and mind. This humble author will share their experiences, thoughts and research notes to guide the valued reader in as safe a manner as the subject matter allows. - """); + this.add(this.context().pageText(), """ + The following pages will lead the novice alchemist on their journey through the noble art of the transformation of matter and mind. This humble author will share their experiences, thoughts and research notes to guide the valued reader in as safe a manner as the subject matter allows. + """); this.context().page("help"); - var help = BookTextPageModel.builder() - .withTitle(this.context().pageTitle()) - .withText(this.context().pageText()) - .build(); + var help = BookTextPageModel.builder().withTitle(this.context().pageTitle()).withText(this.context().pageText()).build(); this.add(this.context().pageTitle(), "Seeking Counsel"); - this.add(this.context().pageText(), - """ - If the reader finds themselves in trouble of any kind, prompt assistance will be provided at the Council of Alchemists, known also as Kli Kli's Discord Server. - \\ - \\ - [To get help, join us at https://dsc.gg/klikli](https://discord.gg/trE4SHRXvb) - """); - - - return BookEntryModel.create(Theurgy.loc(this.context().categoryId() + "/" + this.context().entryId()), this.context().entryName()) - .withDescription(this.context().entryDescription()) - .withIcon(ItemRegistry.THE_HERMETICA_ICON.get()) - .withLocation(this.entryMap().get(icon)) - .withEntryBackground(0, 1) - .withPages( - intro, - help - ); + this.add(this.context().pageText(), """ + If the reader finds themselves in trouble of any kind, prompt assistance will be provided at the Council of Alchemists, known also as Kli Kli's Discord Server. + \\ + \\ + [To get help, join us at https://invite.gg/klikli](https://invite.gg/klikli) + """); + + + return this.entry(location).withIcon(ItemRegistry.THE_HERMETICA_ICON.get()) + + .withEntryBackground(EntryBackground.CATEGORY_START).withPages(intro, help); } - private BookEntryModel makeAboutModEntry(char icon) { + private BookEntryModel aboutModEntry(char location) { this.context().entry("about_mod"); this.add(this.context().entryName(), "The Art of Alchemy"); this.add(this.context().entryDescription(), "About this Mod"); this.context().page("about"); - var about = BookTextPageModel.builder() - .withTitle(this.context().pageTitle()) - .withText(this.context().pageText()) - .build(); + var about = BookTextPageModel.builder().withTitle(this.context().pageTitle()).withText(this.context().pageText()).build(); this.add(this.context().pageTitle(), "The Art of Alchemy"); - this.add(this.context().pageText(), - """ - Welcome, dear reader, to Theurgy, a mod that explores the ancient and revered art of classical alchemy. As you embark on your journey through the noble art of transformation, you will be equipped with divination rods to make finding resources in the world easier. - """); + this.add(this.context().pageText(), """ + Welcome, dear reader, to Theurgy, a mod that explores the ancient and revered art of classical alchemy. As you embark on your journey through the noble art of transformation, you will be equipped with divination rods to make finding resources in the world easier. + """); this.context().page("about2"); - var about2 = BookTextPageModel.builder() - .withText(this.context().pageText()) - .build(); - this.add(this.context().pageText(), - """ - Through diligent study and practice, you will then learn to use alchemical devices to refine, replicate, and transform resources into new and useful materials. Along the way, you will have the opportunity to craft alchemical devices and equipment to aid you in your endeavors. - """); + var about2 = BookTextPageModel.builder().withText(this.context().pageText()).build(); + this.add(this.context().pageText(), """ + Through diligent study and practice, you will then learn to use alchemical devices to refine, replicate, and transform resources into new and useful materials. Along the way, you will have the opportunity to craft alchemical devices and equipment to aid you in your endeavors. + """); + + this.context().page("about3"); + var about3 = BookTextPageModel.builder().withText(this.context().pageText()).build(); + this.add(this.context().pageText(), """ + As a final note, alchemists are guided by reason and logic, not superstition or magic. Our experiments are based on careful observation, meticulous record-keeping, and rigorous testing. We do not claim to possess supernatural powers, but rather seek to harness the natural forces of the world around us to achieve our goals. + """); this.context().page("features"); - var features = BookTextPageModel.builder() - .withTitle(this.context().pageTitle()) - .withText(this.context().pageText()) - .build(); + var features = BookTextPageModel.builder().withTitle(this.context().pageTitle()).withText(this.context().pageText()).build(); this.add(this.context().pageTitle(), "Features"); - this.add(this.context().pageText(), - """ - - Divination rods to find ores - - Future: Ore refining (= more ingots per ore) - - Future: Item replication (create duplicates of items you have) - - Future: Item transformation (create new items from other items) - """); + this.add(this.context().pageText(), """ + - Divination rods to find ores + - Ore refining (= more ingots per ore/raw metal) + - Future: Item replication (create duplicates of items you have) + - Future: Item transformation (create new items from other items) + """); this.context().page("features2"); - var features2 = BookTextPageModel.builder() - .withTitle(this.context().pageTitle()) - .withText(this.context().pageText()) - .build(); + var features2 = BookTextPageModel.builder().withTitle(this.context().pageTitle()).withText(this.context().pageText()).build(); this.add(this.context().pageTitle(), "More Features"); - this.add(this.context().pageText(), - """ - - Future: Weapons and Equipment - - Future: Devices to assist in common tasks - """); - - - return BookEntryModel.create(Theurgy.loc(this.context().categoryId() + "/" + this.context().entryId()), this.context().entryName()) - .withDescription(this.context().entryDescription()) - .withIcon(Items.NETHER_STAR) - .withLocation(this.entryMap().get(icon)) - .withEntryBackground(0, 0) - .withPages( - about, - about2, - features, - features2 - ); + this.add(this.context().pageText(), """ + - Future: Item Transportation + - Future: Weapons and Equipment + - Future: Devices to assist in common tasks + """); + + + return this.entry(location).withIcon(Items.NETHER_STAR) + + .withEntryBackground(EntryBackground.DEFAULT).withPages(about, about2, about3, features, features2); } - private BookEntryModel makeDivinationRodEntry(char icon) { - this.context().entry("divination_rod"); - this.add(this.context().entryName(), "Divination Rods"); - this.add(this.context().entryDescription(), "An Introduction to Ore-Finding"); - this.context().page("intro"); - var intro = BookSpotlightPageModel.builder() - .withItem(Ingredient.of(ItemRegistry.DIVINATION_ROD_T1.get())) - .withText(this.context().pageText()) - .build(); + private BookEntryModel apparatusHowToEntry(char location) { + this.context().entry("apparatus_how_to"); + this.add(this.context().entryName(), "Alchemical Apparatus"); + this.add(this.context().entryDescription(), "How to interact with the tools of the trade"); - this.add(this.context().pageText(), - """ - As a novice alchemist, it is important to familiarize yourself with the various tools and techniques at your disposal. One such tool is the divination rod, a valuable instrument used to locate hidden ores in the world. - """); + this.context().page("intro"); + var intro = BookTextPageModel.builder().withTitle(this.context().pageTitle()).withText(this.context().pageText()).build(); + this.add(this.context().pageTitle(), "Alchemical Apparatus"); + this.add(this.context().pageText(), """ + Alchemist use a variety of tools and devices to aid them in their work. These devices are collectively referred to as apparatus. + \\ + \\ + It is important to understand that each apparatus should only have one specific function, such as generating heat or melting items. + """); this.context().page("intro2"); - var intro2 = BookTextPageModel.builder() - .withText(this.context().pageText()) - .build(); - this.add(this.context().pageText(), - """ - By attuning your senses and your rod to the elemental energies present in the earth, you can detect the presence of ore deposits and guide yourself to their location. With practice, the use of divination rods can greatly aid you in your quest for the resources necessary for your alchemical pursuits. - """); - - this.context().page("recipe"); - var recipe = BookCraftingRecipePageModel.builder() - .withRecipeId1(Theurgy.loc("crafting/shaped/divination_rod_t1")) - .withText(this.context().pageText()) - .build(); - this.add(this.context().pageText(), - """ - The most basic tier of divination rods, brittle and limited in it's application, but powerful nonetheless. - """); - - this.context().page("supported_blocks"); - var supported_blocks = BookTextPageModel.builder() - .withTitle(this.context().pageTitle()) - .withText(this.context().pageText()) - .build(); - this.add(this.context().pageTitle(), "Attunable Materials"); - this.add(this.context().pageText(), - """ - Rods can be attuned to a wide variety of useful blocks, including various types of ores and wood. Basic divination rods will be sufficient to locate common ores such as [iron](item://minecraft:iron_ore) or [coal](item://minecraft:coal_ore), but more rare and precious materials such as [diamonds](item://minecraft:diamond_ore) will require a higher tier rod to detect. + var intro2 = BookTextPageModel.builder().withText(this.context().pageText()).build(); + this.add(this.context().pageText(), """ + By adhering to this principle, we can create a modular system that allows for greater flexibility and efficiency in our work. + \\ + \\ + Further, all apparatus follow a standardized interaction pattern that makes it easier to use them both for manual interactions and for automation. """); - this.context().page("usage"); - var usage = BookTextPageModel.builder() - .withTitle(this.context().pageTitle()) - .withText(this.context().pageText()) - .build(); - this.add(this.context().pageTitle(), "Usage"); - this.add(this.context().pageText(), - """ - - **Shift-Click** a block to attune the rod to it. - - **Right-Click and hold** to let the rod search for blocks. - - **"Right-Click without holding**: after a successful search to let the rod show the last found block without consuming durability. - """); - - - return BookEntryModel.create(Theurgy.loc(this.context().categoryId() + "/" + this.context().entryId()), this.context().entryName()) - .withDescription(this.context().entryDescription()) - .withIcon(ItemRegistry.DIVINATION_ROD_T1.get()) - .withLocation(this.entryMap().get(icon)) - .withEntryBackground(0, 0) - .withPages( - intro, - intro2, - recipe, - supported_blocks, - usage - ); + this.context().page("manual_interaction"); + var manualInteraction = BookTextPageModel.builder().withTitle(this.context().pageTitle()).withText(this.context().pageText()).build(); + this.add(this.context().pageTitle(), "Manual Interaction"); + this.add(this.context().pageText(), """ + To interact with an apparatus, approach it and right-click on it. + \\ + \\ + **Taking Output Items**\\ + If you have an empty hand, the machine will first try to take the contents of its output slot and place them in your inventory. + """); + + this.context().page("manual_interaction2"); + var manualInteraction2 = BookTextPageModel.builder().withText(this.context().pageText()).build(); + this.add(this.context().pageText(), """ + **Taking Input Items**\\ + If there are no output items, it will instead try to place the contents of its input slot into your inventory, effectively emptying it. + \\ + \\ + **Inserting Items**\\ + If you have an item in your hand, the apparatus will automatically try to insert it into the input slot. + """); + + this.context().page("fluid_interaction"); + var fluidInteraction = BookTextPageModel.builder().withTitle(this.context().pageTitle()).withText(this.context().pageText()).build(); + this.add(this.context().pageTitle(), "Fluids"); + this.add(this.context().pageText(), """ + If you click on an apparatus with a filled fluid container in your hand, it will try to empty the container into the device. + \\ + \\ + If you click on an apparatus with an empty fluid container in your hand, it will instead try to fill the container from the device. + """); + + this.context().page("automatic_interaction"); + var automaticInteraction = BookTextPageModel.builder().withTitle(this.context().pageTitle()).withText(this.context().pageText()).build(); + + this.add(this.context().pageTitle(), "Automatic Interaction"); + this.add(this.context().pageText(), """ + Automatic interactions also use a standardized pattern. + \\ + \\ + **Input** slots can be accessed from the **top**, while **output** slots are available at the **bottom**.\\ + \\ + A **combined inventory** can be found at the horizontal **sides**. + """); + + + return this.entry(location).withIcon(BlockRegistry.PYROMANTIC_BRAZIER.get()) + + .withEntryBackground(EntryBackground.DEFAULT).withPages(intro, intro2, manualInteraction, manualInteraction2, fluidInteraction, automaticInteraction); } + + private BookEntryModel spagyricsEntry(char location) { + this.context().entry("spagyrics"); + this.add(this.context().entryName(), "Spagyrics"); + this.add(this.context().entryDescription(), "Mastery over Matter"); + + this.context().page("intro"); + var intro = BookTextPageModel.builder().withTitle(this.context().pageTitle()).withText(this.context().pageText()).build(); + this.add(this.context().pageTitle(), "Spagyrics"); + this.add(this.context().pageText(), """ + While divination rods are a useful tool to obtain *more* materials, they rely on the natural abundance of such materials. + \\ + \\ + Spagyrics pursue the goal of *creating* materials out of other, possibly more abundant, materials."""); + + this.context().page("intro2"); + var intro2 = BookTextPageModel.builder().withTitle(this.context().pageTitle()).withText(this.context().pageText()).build(); + this.add(this.context().pageTitle(), "Learn More"); + this.add(this.context().pageText(), """ + Open the Spagyrics Category to learn more about the various required alchemical processes. + """); + + return this.entry(location).withIcon(BlockRegistry.CALCINATION_OVEN.get()) + + .withEntryBackground(EntryBackground.DEFAULT).withPages(intro, intro2); + } + + private BookEntryModel spagyricsLinkEntry(char location) { + this.context().entry("spagyrics_link"); + this.add(this.context().entryName(), "Spagyrics"); + this.add(this.context().entryDescription(), "View the Spagyrics Category"); + + return this.entry(location).withIcon(BlockRegistry.CALCINATION_OVEN.get()) + .withCategoryToOpen(Theurgy.loc(SpagyricsCategoryProvider.CATEGORY_ID)) + .withEntryBackground(EntryBackground.LINK_TO_CATEGORY); + } + + } diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/book/OreRefiningEntryProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/book/OreRefiningEntryProvider.java new file mode 100644 index 000000000..10c1b2883 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/book/OreRefiningEntryProvider.java @@ -0,0 +1,696 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.datagen.book; + +import com.klikli_dev.modonomicon.api.datagen.CategoryEntryMap; +import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; +import com.klikli_dev.modonomicon.api.datagen.book.BookCategoryModel; +import com.klikli_dev.modonomicon.api.datagen.book.BookEntryModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookSpotlightPageModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.BookTextPageModel; +import com.klikli_dev.theurgy.registry.ItemRegistry; +import com.klikli_dev.theurgy.registry.SaltRegistry; +import com.klikli_dev.theurgy.registry.SulfurRegistry; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; + +/** + * A dummy provider to separate the generation of ore refining entries from the rest of the getting started category + */ +public class OreRefiningEntryProvider extends CategoryProvider { + + public OreRefiningEntryProvider(TheurgyBookProvider parent, CategoryEntryMap entryMap) { + super(parent, "dummy"); + this.entryMap = entryMap; + } + + public TheurgyBookProvider parent() { + return (TheurgyBookProvider) this.parent; + } + + @Override + protected String[] generateEntryMap() { + throw new UnsupportedOperationException("This is a dummy provider to help generate entries, it should not be used to generate a Category."); + } + + @Override + protected void generateEntries() { + throw new UnsupportedOperationException("This is a dummy provider to help generate entries, it should not be used to generate a Category."); + } + + @Override + protected BookCategoryModel generateCategory() { + throw new UnsupportedOperationException("This is a dummy provider to help generate entries, it should not be used to generate a Category."); + } + + public BookEntryModel aboutOreRefiningEntry(char location) { + this.context().entry("about_ore_refining"); + this.add(this.context().entryName(), "Ore Refining"); + this.add(this.context().entryDescription(), "Triple your ore yield - at a cost!"); + + this.context().page("intro"); + var intro = BookSpotlightPageModel.builder() + .withItem(Ingredient.of(Items.RAW_IRON)) + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageTitle(), "Ore Duplication"); + this.add(this.context().pageText(), + """ + In the following pages and entries we will attempt to create three iron ingots out of just one iron ore using alchemical processes. + """ + ); + + this.context().page("intro2"); + var intro2 = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageTitle(), "Spagyrics for Refining"); + this.add(this.context().pageText(), + """ + The easiest application of Spagyrics is the refining of ores and raw metals. The process of smelting ores in a furnace is wasteful, as it only yields a single ingot per ore, losing a lot of the precious raw materials in the process. Alchemists can extract even the last iota of value from ores, but the process is somewhat more complex. + """); + + this.context().page("overview"); + var overview = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "The Process"); + this.add(this.context().pageText(), + """ + To refine an Ore or Raw Metal you first need to {0} it, which will yield multiple Ore Sulfur. Additionally you need to obtain multiple heaps of {1} to provide a body for this multiplied Sulfur, and some {2} to provide the mercury for the soul of the resulting refined ingots. + """, + this.entryLink("liquefy", SpagyricsCategoryProvider.CATEGORY_ID, "liquefaction_cauldron"), + this.itemLink("Mineral Salt", SaltRegistry.MINERAL.get()), + this.itemLink("Mercury Shards", ItemRegistry.MERCURY_SHARD.get()) + ); + + this.context().page("cost"); + var cost = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "The Cost"); + this.add(this.context().pageText(), + """ + To bring it to a point, the cost of significantly increasing ore yield with Spagyrics is having to obtain high amounts of {0} which is mainly sourced from ... Metals. + """, + this.itemLink("Mineral Salt", SaltRegistry.MINERAL.get()) + ); + + this.context().page("cost2"); + var cost2 = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "The Cost"); + this.add(this.context().pageText(), + """ + The first and obvious solution to this chicken-and-egg problem is to {0} abundant metals, such as {1}, and use the salt to {2} more valuable materials such as {3} or even {4} as output. + """, + this.entryLink("calcinate", SpagyricsCategoryProvider.CATEGORY_ID, "calcination_oven"), + this.itemLink(Items.RAW_COPPER), + this.entryLink("incubate", SpagyricsCategoryProvider.CATEGORY_ID, "incubator"), + this.itemLink(Items.IRON_INGOT), + this.itemLink(Items.DIAMOND) + ); + + this.context().page("silver_lining"); + var silverLining = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "The Silver Lining"); + this.add(this.context().pageText(), + """ + As luck would have it another option to obtain {0} is to calcinate it from {1}, which is in turn obtained by calcinating Sand, Cobblestone, etc. This is a somewhat lossy process as it requires a lot of {1}, but it does have the upside of giving those abundant materials a use. + """, + this.itemLink("Mineral Salt", SaltRegistry.MINERAL.get()), + this.itemLink("Strata Salt", SaltRegistry.STRATA.get()) + ); + + this.context().page("soul"); + var soul = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "The Soul"); + this.add(this.context().pageText(), + """ + Obtaining {0} is usually not much of an issue as a wide variety of materials can be {1} to obtain in. + """, + this.itemLink(ItemRegistry.MERCURY_SHARD.get()), + this.entryLink("distilled", SpagyricsCategoryProvider.CATEGORY_ID, "distiller") + ); + + this.context().page("next"); + var next = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "Further Reading"); + this.add(this.context().pageText(), + """ + The next entries will guide you through the process of obtaining all the materials and creating your iron ingots. + """); + + return this.entry(location) + .withIcon(Items.RAW_IRON) + .withEntryBackground(EntryBackground.DEFAULT) + .withPages( + intro, + intro2, + overview, + cost, + cost2, + silverLining, + soul, + next + ); + } + + public BookEntryModel neededApparatusEntry(char location) { + this.context().entry("needed_apparatus"); + this.add(this.context().entryName(), "Required Apparatus"); + this.add(this.context().entryDescription(), "Tools for Refinement"); + + this.context().page("intro"); + var intro = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "Required Apparatus"); + this.add(this.context().pageText(), + """ + Ore Refining needs all of the Spagyrics Apparatus to extract all the needed materials and recombine them. + Review the full {0} Category on how to craft and use them. + """, + this.categoryLink("Spagyrics", SpagyricsCategoryProvider.CATEGORY_ID) + ); + + this.context().page("pyromantic_brazier"); + var pyromantic_brazier = BookSpotlightPageModel.builder() + .withItem(Ingredient.of(ItemRegistry.PYROMANTIC_BRAZIER.get())) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageText(), + """ + You will need 4 of these to power the other Apparatus. + """ + ); + + this.context().page("calcination_oven"); + var calcination_oven = BookSpotlightPageModel.builder() + .withItem(Ingredient.of(ItemRegistry.CALCINATION_OVEN.get())) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageText(), + """ + The Calcination Oven will allow you to create the {0}. + """, + this.itemLink("Mineral Salt", SaltRegistry.MINERAL.get()) + ); + + this.context().page("sal_ammoniac_accumulator"); + var sal_ammoniac_accumulator = BookSpotlightPageModel.builder() + .withItem(Ingredient.of(ItemRegistry.SAL_AMMONIAC_ACCUMULATOR.get())) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageText(), + """ + The Sal Ammoniac Accumulator will fill the Sal Ammoniac Tank with solvent. + """ + ); + + this.context().page("sal_ammoniac_tank"); + var sal_ammoniac_tank = BookSpotlightPageModel.builder() + .withItem(Ingredient.of(ItemRegistry.SAL_AMMONIAC_TANK.get())) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageText(), + """ + The Sal Ammoniac Tank stores the solvent - Sal Ammoniac - for use in the Liquefaction Cauldron. + """ + ); + + this.context().page("liquefaction_cauldron"); + var liquefaction_cauldron = BookSpotlightPageModel.builder() + .withItem(Ingredient.of(ItemRegistry.LIQUEFACTION_CAULDRON.get())) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageText(), + """ + The Liquefaction Cauldron uses Sal Ammoniac to extract Alchemical Sulfur. + """ + ); + + this.context().page("distiller"); + var distiller = BookSpotlightPageModel.builder() + .withItem(Ingredient.of(ItemRegistry.DISTILLER.get())) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageText(), + """ + The Distiller creates {0}. + """, + this.itemLink("Mercury Shards", ItemRegistry.MERCURY_SHARD.get()) + ); + + this.context().page("incubator"); + var incubator = BookSpotlightPageModel.builder() + .withItem(Ingredient.of(ItemRegistry.INCUBATOR.get())) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageText(), + """ + Finally, the incubator recombines the Salt, Sulfur, and Mercury into the refined item, Iron Ingots in our case. + It needs one each of {0}, {1}, {2} to hold the input materials. + """, + this.itemLink("Salt Vessel", ItemRegistry.INCUBATOR_SALT_VESSEL.get()), + this.itemLink("Mercury Vessel", ItemRegistry.INCUBATOR_MERCURY_VESSEL.get()), + this.itemLink("Sulfur Vessel", ItemRegistry.INCUBATOR_SULFUR_VESSEL.get()) + ); + + this.context().page("next_steps"); + var next_steps = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "Next Steps"); + this.add(this.context().pageText(), + """ + Place all the apparatus, those that need heating on pyromantic braziers. Prepare some Coal to heat the braziers, then open the next entry. + """ + ); + + return this.entry(location) + .withIcon(ItemRegistry.DISTILLER.get()) + .withEntryBackground(EntryBackground.DEFAULT) + .withPages( + intro, + pyromantic_brazier, + calcination_oven, + sal_ammoniac_accumulator, + sal_ammoniac_tank, + liquefaction_cauldron, + distiller, + incubator, + next_steps + ); + } + + public BookEntryModel createSolventEntry(char location) { + this.context().entry("create_solvent"); + this.add(this.context().entryName(), "Accumulating Solvent"); + this.add(this.context().entryDescription(), "Obtaining Sal Ammoniac - they key to Sulfur Extraction"); + + this.context().page("intro"); + var intro = BookSpotlightPageModel.builder() + .withItem(Ingredient.of(ItemRegistry.SAL_AMMONIAC_BUCKET.get())) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageText(), + """ + There are two ways of obtaining Sal Ammoniac, both use the Accumulator Apparatus. The first, slower, option is to simply place water in the accumulator, and let it slowly concentrate the inherently contained Sal Ammoniac. The second, faster, option is to additionally add a {0} to speed up the process significantly. + """, + this.itemLink(ItemRegistry.SAL_AMMONIAC_CRYSTAL.get()) + ); + + this.context().page("step1"); + var step1 = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageTitle(), "Filling the Accumulator"); + this.add(this.context().pageText(), + """ + After placing the {0} on a {1}, right-click the {0} with water buckets (up to 10) to fill it. + """, + this.itemLink(ItemRegistry.SAL_AMMONIAC_ACCUMULATOR.get()), + this.itemLink(ItemRegistry.SAL_AMMONIAC_TANK.get()) + ); + + this.context().page("step2"); + var step2 = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageTitle(), "Adding Crystals"); + this.add(this.context().pageText(), + """ + Optionally you can now right-click the {0} with a {1} (obtained by mining). You will get Sal Ammoniac regardless, but the crystal will speed up the process significantly. + """, + this.itemLink(ItemRegistry.SAL_AMMONIAC_ACCUMULATOR.get()), + this.itemLink(ItemRegistry.SAL_AMMONIAC_CRYSTAL.get()) + ); + + + this.context().page("step3"); + var step3 = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageTitle(), "Obtaining the Sal Ammoniac"); + this.add(this.context().pageText(), + """ + Once the {0} has filled up sufficiently, you can right-click it with an empty bucket to obtain a {1}. + """, + this.itemLink(ItemRegistry.SAL_AMMONIAC_TANK.get()), + this.itemLink(ItemRegistry.SAL_AMMONIAC_BUCKET.get()) + ); + + return this.entry(location, ItemRegistry.SAL_AMMONIAC_BUCKET.get()) + .withPages( + intro, + step1, + step2, + step3 + ); + } + + public BookEntryModel createSulfurEntry(char location) { + this.context().entry("create_sulfur"); + this.add(this.context().entryName(), "Extracting Sulfur"); + this.add(this.context().entryDescription(), "Obtaining Sulfur - the \"Soul\""); + + this.context().page("intro"); + var intro = BookSpotlightPageModel.builder() + .withItem(Ingredient.of(SulfurRegistry.IRON.get())) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageText(), + """ + Sulfur extraction is the part of ore purification that leads to [#]($PURPLE)multiplication[#](). One Ore or Raw Metal yields multiple sulfurs, which then each can be refined into an ingot. + """ + ); + + this.context().page("step1"); + var step1 = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageTitle(), "Filling the Liquefaction Cauldron"); + this.add(this.context().pageText(), + """ + Right-click the {0} with a {1} to fill it. + """, + this.itemLink(ItemRegistry.LIQUEFACTION_CAULDRON.get()), + this.itemLink(ItemRegistry.SAL_AMMONIAC_BUCKET.get()) + ); + + this.context().page("step2"); + var step2 = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageTitle(), "Adding Raw Materials"); + this.add(this.context().pageText(), + """ + Now right-click the {0} with the item you want to extract sulfur from, such as {1}. The item will be placed inside. + """, + this.itemLink(ItemRegistry.LIQUEFACTION_CAULDRON.get()), + this.itemLink(Items.RAW_IRON) + ); + + this.context().page("step3"); + var step3 = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageTitle(), "Providing Heat"); + this.add(this.context().pageText(), + """ + Now add fuel, such as Coal, to the {0} below the {1} to heat it up. + """, + this.itemLink(ItemRegistry.PYROMANTIC_BRAZIER.get()), + this.itemLink(ItemRegistry.LIQUEFACTION_CAULDRON.get()) + ); + + this.context().page("step4"); + var step4 = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageTitle(), "Obtaining the Sulfur"); + this.add(this.context().pageText(), + """ + After a while some sulfur will have been extracted, you can right-click the {0} with an empty hand to obtain {1}. + """, + this.itemLink(ItemRegistry.LIQUEFACTION_CAULDRON.get()), + this.itemLink("Alchemical Sulfur", SulfurRegistry.IRON.get()) + ); + + + return this.entry(location, SulfurRegistry.IRON.get()) + .withPages( + intro, + step1, + step2, + step3, + step4 + ); + } + + public BookEntryModel createSaltEntry(char location) { + this.context().entry("create_salt"); + this.add(this.context().entryName(), "Extracting Salt"); + this.add(this.context().entryDescription(), "Obtaining Salt - the \"Body\""); + + this.context().page("intro"); + var intro = BookSpotlightPageModel.builder() + .withItem(Ingredient.of(SaltRegistry.MINERAL.get())) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageText(), + """ + Salt is needed in order to create items from Alchemical Sulfur. The type of salt needs to match the type of sulfur - for our project that involves {0} we need {1}, which covers all types of ores and metals. + """, + this.itemLink("Iron Sulfur", SulfurRegistry.IRON.get()), + this.itemLink("Mineral Salt", SaltRegistry.MINERAL.get()) + ); + + this.context().page("step1"); + var step1 = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageTitle(), "Calcinating Minerals"); + this.add(this.context().pageText(), + """ + Right-click the {0} with any Mineral such as Ores, Raw Metals or Ingots to calcinate it. + One option is to use a Stack of {1}, which in turn is calcinated from Stone, Sand, Gravel, Dirt, etc. + Another great source is {2}, as it is renewable. + """, + this.itemLink(ItemRegistry.CALCINATION_OVEN.get()), + this.itemLink("Strata Salt", SaltRegistry.STRATA.get()), + this.itemLink(Items.CHARCOAL) + ); + + this.context().page("step2"); + var step2 = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageTitle(), "Providing Heat"); + this.add(this.context().pageText(), + """ + Now add fuel, such as Coal, to the {0} below the {1} to heat it up. + """, + this.itemLink(ItemRegistry.PYROMANTIC_BRAZIER.get()), + this.itemLink(ItemRegistry.CALCINATION_OVEN.get()) + ); + + this.context().page("step3"); + var step3 = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageTitle(), "Obtaining the Salt"); + this.add(this.context().pageText(), + """ + After a while some salt will have been created, you can right-click the {0} with an empty hand to obtain {1}. + """, + this.itemLink(ItemRegistry.CALCINATION_OVEN.get()), + this.itemLink("Mineral Salt", SaltRegistry.MINERAL.get()) + ); + + + return this.entry(location, SaltRegistry.MINERAL.get()) + .withPages( + intro, + step1, + step2, + step3 + ); + } + + public BookEntryModel createMercuryEntry(char location) { + this.context().entry("create_mercury"); + this.add(this.context().entryName(), "Extracting Mercury"); + this.add(this.context().entryDescription(), "Obtaining Mercury - the \"Spirit\""); + + this.context().page("intro"); + var intro = BookSpotlightPageModel.builder() + .withItem(Ingredient.of(ItemRegistry.MERCURY_SHARD.get())) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageText(), + """ + Mercury is the spirit, or energy, contained within matter. Like Salt, it is needed to create items from Alchemical Sulfur. Almost all items yield Mercury, but the more valuable and the more refined the item, the more mercury they will yield. + """ + ); + + this.context().page("step1"); + var step1 = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageTitle(), "Distilling Mercury"); + this.add(this.context().pageText(), + """ + Right-click the {0} with any mercury-yielding item, such as Crops, Food, Ores, Raw Metals, but also Stone, Sand, Glass, ...\\ + For low-value items you may need to add multiple items at once to obtain even one {1}. + """, + this.itemLink(ItemRegistry.DISTILLER.get()), + this.itemLink(ItemRegistry.MERCURY_SHARD.get()) + ); + + this.context().page("step2"); + var step2 = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageTitle(), "Providing Heat"); + this.add(this.context().pageText(), + """ + Now add fuel, such as Coal, to the {0} below the {1} to heat it up. + """, + this.itemLink(ItemRegistry.PYROMANTIC_BRAZIER.get()), + this.itemLink(ItemRegistry.DISTILLER.get()) + ); + + this.context().page("step3"); + var step3 = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageTitle(), "Obtaining the Mercury"); + this.add(this.context().pageText(), + """ + After a while some mercury shards will have been created, you can right-click the {0} with an empty hand to obtain {1}. + """, + this.itemLink(ItemRegistry.DISTILLER.get()), + this.itemLink(ItemRegistry.MERCURY_SHARD.get()) + ); + + + return this.entry(location, ItemRegistry.MERCURY_SHARD.get()) + .withPages( + intro, + step1, + step2, + step3 + ); + } + + public BookEntryModel incubationEntry(char location) { + this.context().entry("incubation"); + this.add(this.context().entryName(), "Incubating Iron"); + this.add(this.context().entryDescription(), "Creating Iron Ingots from Sulfur, Salt and Mercury"); + + this.context().page("intro"); + var intro = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "Incubating Iron"); + this.add(this.context().pageText(), + """ + The final step is to recombine the three principles into usable Iron Ingots. + """ + ); + + this.context().page("step1"); + var step1 = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageTitle(), "Filling the Vessels"); + this.add(this.context().pageText(), + """ + Right-click the {0}, {1} and {2} with the Sulfur, Salt and Mercury you obtained earlier respectively to fill them. + """, + this.itemLink(ItemRegistry.INCUBATOR_SULFUR_VESSEL.get()), + this.itemLink(ItemRegistry.INCUBATOR_SALT_VESSEL.get()), + this.itemLink(ItemRegistry.INCUBATOR_MERCURY_VESSEL.get()) + ); + + this.context().page("step2"); + var step2 = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageTitle(), "Providing Heat"); + this.add(this.context().pageText(), + """ + Now add fuel, such as Coal, to the {0} below the {1} to heat it up. + """, + this.itemLink(ItemRegistry.PYROMANTIC_BRAZIER.get()), + this.itemLink(ItemRegistry.INCUBATOR.get()) + ); + + this.context().page("step3"); + var step3 = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + + this.add(this.context().pageTitle(), "Obtaining the Incubated Item"); + this.add(this.context().pageText(), + """ + After a while the input items will have been consumed and incubated into the result, you can right-click the {0} with an empty hand to obtain 3x {1}. + \\ + \\ + **Congratulations, you created 3 Ingots from one Raw Metal!** + """, + this.itemLink(ItemRegistry.INCUBATOR.get()), + this.itemLink(Items.IRON_INGOT) + ); + + + return this.entry(location, Items.IRON_INGOT) + .withPages( + intro, + step1, + step2, + step3 + ); + } +} \ No newline at end of file diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/book/SpagyricsCategoryProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/book/SpagyricsCategoryProvider.java new file mode 100644 index 000000000..347b13bd8 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/book/SpagyricsCategoryProvider.java @@ -0,0 +1,735 @@ +/* + * SPDX-FileCopyrightText: 2022 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.datagen.book; + +import com.klikli_dev.modonomicon.api.datagen.BookProvider; +import com.klikli_dev.modonomicon.api.datagen.CategoryProvider; +import com.klikli_dev.modonomicon.api.datagen.book.BookCategoryModel; +import com.klikli_dev.modonomicon.api.datagen.book.BookEntryModel; +import com.klikli_dev.modonomicon.api.datagen.book.page.*; +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.integration.modonomicon.page.accumulation.BookAccumulationRecipePageModel; +import com.klikli_dev.theurgy.registry.ItemRegistry; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; + +public class SpagyricsCategoryProvider extends CategoryProvider { + + public static final String CATEGORY_ID = "spagyrics"; + + public SpagyricsCategoryProvider(BookProvider parent) { + super(parent, CATEGORY_ID); + } + + @Override + protected String[] generateEntryMap() { + return new String[]{ + "__________________________________", + "__________________________________", + "________________c_________________", + "__________________________________", + "__________i_p_b___s_l_r_o_________", + "__________________________________", + "________________d_________________", + "__________________________________", + "__________________________________" + }; + } + + @Override + protected void generateEntries() { + + var introEntry = this.add(this.makeIntroEntry('i')); + var principlesEntry = this.add(this.makePrinciplesEntry('p')); + principlesEntry.withParent(introEntry); + + var pyromanticBrazierEntry = this.add(this.makePyromanticBrazierEntry('b')); + pyromanticBrazierEntry.withParent(principlesEntry); + + var calcinationOvenEntry = this.add(this.makeCalcinationOvenEntry('c')); + calcinationOvenEntry.withParent(pyromanticBrazierEntry); + + var solventEntry = this.add(this.makeSolventsEntry('s')); + solventEntry.withParent(pyromanticBrazierEntry); + + var liquefactionCauldronEntry = this.add(this.makeLiquefactionCauldronEntry('l')); + liquefactionCauldronEntry.withParent(solventEntry); + + var distillerEntry = this.add(this.makeDistillerEntry('d')); + distillerEntry.withParent(pyromanticBrazierEntry); + + var incubatorEntry = this.add(this.makeIncubatorEntry('r')); + incubatorEntry.withParent(calcinationOvenEntry); + incubatorEntry.withParent(liquefactionCauldronEntry); + incubatorEntry.withParent(distillerEntry); + + var oreRefiningLinkEntry = this.add(this.makeOreRefiningLinkEntry('o')); + oreRefiningLinkEntry.withParent(incubatorEntry); + } + + @Override + protected BookCategoryModel generateCategory() { + this.add(this.context().categoryName(), "Spagyrics"); + + return BookCategoryModel.create( + Theurgy.loc(this.context().categoryId()), + this.context().categoryName() + ) + .withBackground(Theurgy.loc("textures/gui/book/bg_nightsky2.png")) + .withIcon(ItemRegistry.CALCINATION_OVEN.get()); + } + + + private BookEntryModel makeIntroEntry(char location) { + this.context().entry("intro"); + this.add(this.context().entryName(), "Spagyrics"); + this.add(this.context().entryDescription(), "Power over the Three Principles"); + + this.context().page("intro"); + var intro = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "Spagyrics"); + this.add(this.context().pageText(), + """ + Spagyrics is derived from Greek for "to separate and reunite". As such, it is the process of separating, purifying and recombining the *three principles*, or "elements", of matter: Alchemical **Salt**, **Sulfur** and **Mercury**. + """); + + this.context().page("intro2"); + var intro2 = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "Benefits"); + this.add(this.context().pageText(), + """ + The inquisitive mind may ask: "Why would one want to do that?". The answer lies in the promise of total control over all aspects of matter, including the ability to create any type of matter from any other type. + """); + + return this.entry(location) + .withIcon(ItemRegistry.CALCINATION_OVEN.get()) + .withEntryBackground(EntryBackground.CATEGORY_START) + .withPages( + intro, + intro2 + ); + } + + private BookEntryModel makePrinciplesEntry(char location) { + this.context().entry("principles"); + this.add(this.context().entryName(), "The Three Principles"); + this.add(this.context().entryDescription(), "An Introduction to Alchemical Elements"); + + this.context().page("intro"); + var intro = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "The Three Principles"); + this.add(this.context().pageText(), + """ + The [#]($PURPLE)Principles[#](), or Essentials, are the three basic elements all things are made of. + \\ + \\ + Despite the name, they are unrelated to the common materials often associated with these words, such as table salt, metallic mercury and the mineral sulfur. + """); + + this.context().page("salt"); + var salt = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "Alchemical Salt"); + this.add(this.context().pageText(), + """ + [#]($PURPLE)Alchemical Salt[#]() is the principle representing the **Body** of a thing. It provides the matrix wherein Sulfur and Mercury can act. As such it is associated with materiality, stability and manifestation in the physical world. + """); + + this.context().page("sulfur"); + var sulfur = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "Alchemical Sulfur"); + this.add(this.context().pageText(), + """ + [#]($PURPLE)Alchemical Sulfur[#]() is the **Soul** of a thing. It represents the unique properties of a piece of matter, such as how it will look, feel, and how it interacts with other things. + \\ + \\ + Transforming the Sulfur of one thing is the underlying idea of *transmutation*. + """); + + this.context().page("mercury"); + var mercury = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "Alchemical Mercury"); + this.add(this.context().pageText(), + """ + [#]($PURPLE)Alchemical Mercury[#]() is the **Energy** or Life Force of a thing. It is the most elusive of the three principles, and enables the other two principles to function. + """); + + return this.entry(location) + .withIcon(ItemRegistry.MERCURY_CRYSTAL.get()) + .withEntryBackground(EntryBackground.DEFAULT) + .withPages( + intro, + salt, + sulfur, + mercury + ); + } + + private BookEntryModel makePyromanticBrazierEntry(char location) { + this.context().entry("pyromantic_brazier"); + this.add(this.context().entryName(), "Pyromantic Brazier"); + this.add(this.context().entryDescription(), "Heating your Alchemical Devices"); + + this.context().page("intro"); + var intro = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "Pyromantic Brazier"); + this.add(this.context().pageText(), + """ + The {0} is a simple heating apparatus that can be used to power other Alchemical Devices. It is powered by burning furnace fuel, such as wood, coal, or charcoal. + """, + this.itemLink(ItemRegistry.PYROMANTIC_BRAZIER.get()) + ); + + + this.context().page("usage"); + var usage = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "Usage"); + this.add(this.context().pageText(), + """ + Place the {0} below the Alchemical Device you want to power, then insert a fuel item by right-clicking the brazier with it. + \\ + \\ + Alternatively a hopper can be used to insert fuel items. + \\ + \\ + See also {1}. + """, + this.itemLink(ItemRegistry.PYROMANTIC_BRAZIER.get()), + this.entryLink("Alchemical Apparatus", GettingStartedCategoryProvider.CATEGORY_ID, "apparatus_how_to") + ); + + this.context().page("recipe"); + var recipe = BookCraftingRecipePageModel.builder() + .withRecipeId1(Theurgy.loc("crafting/shaped/pyromantic_brazier")) + .build(); + //no text + + return this.entry(location) + .withIcon(ItemRegistry.PYROMANTIC_BRAZIER.get()) + .withEntryBackground(EntryBackground.DEFAULT) + .withPages( + intro, + usage, + recipe + ); + } + + private BookEntryModel makeCalcinationOvenEntry(char location) { + this.context().entry("calcination_oven"); + this.add(this.context().entryName(), "Calcination Oven"); + this.add(this.context().entryDescription(), "Making Salt"); + + this.context().page("intro"); + var intro = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "Calcination Oven"); + this.add(this.context().pageText(), + """ + Calcination is the process whereby [#]($PURPLE)Alchemical Salt[#]() is extracted from matter. The {0} is a simple device that can be used to perform this process by applying consistent high heat to the target object. + """, + this.itemLink(ItemRegistry.CALCINATION_OVEN.get()) + ); + + this.context().page("multiblock"); + var multiblock = BookMultiblockPageModel.builder() + .withMultiblockId(Theurgy.loc("placement/calcination_oven")) + .build(); + + this.context().page("usage"); + var usage = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "Usage"); + this.add(this.context().pageText(), + """ + Place the {0} on top of a {1}, then insert the item to calcinate by right-clicking the oven with it. + \\ + \\ + Alternatively a hopper can be used to insert items to process. + \\ + \\ + See also {2}. + """, + this.itemLink(ItemRegistry.CALCINATION_OVEN.get()), + this.itemLink(ItemRegistry.PYROMANTIC_BRAZIER.get()), + this.entryLink("Alchemical Apparatus", GettingStartedCategoryProvider.CATEGORY_ID, "apparatus_how_to") + ); + + this.context().page("recipe"); + var recipe = BookCraftingRecipePageModel.builder() + .withRecipeId1(Theurgy.loc("crafting/shaped/calcination_oven")) + .build(); + //no text + +// this.context().page("recipe_ore"); +// var recipeOre = BookCalcinationRecipePageModel.builder() +// .withTitle1(this.context().pageTitle()) +// .withRecipeId1(Theurgy.loc("calcination/ore")) +// .build(); +// this.add(this.context().pageTitle(), "Sample Recipe"); + //no text + + this.context().page("working"); + var working = BookImagePageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .withImages(this.modLoc("textures/gui/book/calcination_oven_working.png")) + .build(); + this.add(this.context().pageTitle(), "Working Correctly"); + this.add(this.context().pageText(), + """ + If the {0} is working properly, it will show the orange rings moving slightly. + """, + this.itemLink(ItemRegistry.CALCINATION_OVEN.get()) + ); + + return this.entry(location) + .withIcon(ItemRegistry.CALCINATION_OVEN.get()) + .withEntryBackground(EntryBackground.DEFAULT) + .withPages( + intro, + multiblock, + usage, + recipe, +// recipeOre + working + ); + } + + private BookEntryModel makeSolventsEntry(char location) { + this.context().entry("solvents"); + this.add(this.context().entryName(), "Solvents"); + this.add(this.context().entryDescription(), "Solving all your problems?"); + + this.context().page("intro"); + var intro = BookSpotlightPageModel.builder() + .withItem(Ingredient.of(ItemRegistry.SAL_AMMONIAC_BUCKET.get())) + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "Solvents"); + this.add(this.context().pageText(), + """ + Solvents are required for the process of Liquefaction, by which [#]($PURPLE)Alchemical Sulfur[#]() is extracted from matter. Usually they are a type of acid. The following solvents are available: + - Sal Ammoniac + - Alkahest *(not yet implemented)* + """); + //TODO: Update entry once alkahest is available + + this.context().page("crafting"); + var crafting = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "Crafting"); + this.add(this.context().pageText(), + """ + Sal Ammoniac is crafted in a {0}. It has two modes of operation: It can increase the concentration of naturally occuring Sal Ammoniac in water to a usable level via evaporation, which is a rather slow and inefficient process, or it can enrich water with {1} to produce a usable solvent much quicker. + """, + this.itemLink(ItemRegistry.SAL_AMMONIAC_ACCUMULATOR.get()), + this.itemLink("Sal Ammoniac Crystals", ItemRegistry.SAL_AMMONIAC_CRYSTAL.get()) + ); + + this.context().page("multiblock"); + var multiblock = BookMultiblockPageModel.builder() + .withMultiblockId(Theurgy.loc("placement/sal_ammoniac_accumulator")) + .build(); + + this.context().page("usage"); + var usage = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "Usage"); + this.add(this.context().pageText(), + """ + Place the {0} on top of a {1}, and fill it with a Water by right-clicking with a water bucket. + \\ + \\ + Optionally insert a {2} by right-clicking the cauldron with it to speed up the process. + \\ + \\ + See also {3}. + """, + this.itemLink(ItemRegistry.SAL_AMMONIAC_ACCUMULATOR.get()), + this.itemLink(ItemRegistry.SAL_AMMONIAC_TANK.get()), + this.itemLink(ItemRegistry.SAL_AMMONIAC_CRYSTAL.get()), + this.entryLink("Alchemical Apparatus", GettingStartedCategoryProvider.CATEGORY_ID, "apparatus_how_to") + ); + + this.context().page("recipe1"); + var recipe1 = BookCraftingRecipePageModel.builder() + .withRecipeId1(Theurgy.loc("crafting/shaped/sal_ammoniac_accumulator")) + .build(); + //no text + + this.context().page("recipe2"); + var recipe2 = BookCraftingRecipePageModel.builder() + .withRecipeId1(Theurgy.loc("crafting/shaped/sal_ammoniac_tank")) + .build(); + //no text + + this.context().page("working"); + var working = BookImagePageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .withImages(this.modLoc("textures/gui/book/256.png")) //TODO: Hermetica: add real image + .build(); + this.add(this.context().pageTitle(), "Working Correctly"); + this.add(this.context().pageText(), + """ + If the {0} is working properly, it will show bubbles. + """, + this.itemLink(ItemRegistry.SAL_AMMONIAC_ACCUMULATOR.get()) + ); + + this.context().page("sal_ammoniac_crystal"); + var crystal = BookSpotlightPageModel.builder() + .withItem(Ingredient.of(ItemRegistry.SAL_AMMONIAC_CRYSTAL.get())) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageText(), + """ + The crystals can be obtained by mining {0}. + """, + this.itemLink(ItemRegistry.SAL_AMMONIAC_ORE.get()) + ); + + this.context().page("sal_ammoniac_fluid_recipe"); + var salAmmoniacFluidRecipe = BookAccumulationRecipePageModel.builder() + .withRecipeId1(Theurgy.loc("accumulation/sal_ammoniac_from_water")) + .withRecipeId2(Theurgy.loc("accumulation/sal_ammoniac_from_water_and_sal_ammoniac_crystal")) + .withTitle2(this.context().pageTitle() + ".2") + .build(); + this.add(this.context().pageTitle() + ".2", "... using Crystal"); + //no text + + return this.entry(location) + .withIcon(ItemRegistry.SAL_AMMONIAC_TANK.get()) + .withEntryBackground(EntryBackground.DEFAULT) + .withPages( + intro, + crafting, + multiblock, + usage, + recipe1, + recipe2, + working, + crystal, + salAmmoniacFluidRecipe + ); + } + + private BookEntryModel makeLiquefactionCauldronEntry(char location) { + this.context().entry("liquefaction_cauldron"); + this.add(this.context().entryName(), "Liquefaction Cauldron"); + this.add(this.context().entryDescription(), "Making Sulfur"); + + this.context().page("intro"); + var intro = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "Liquefaction Cauldron"); + this.add(this.context().pageText(), + """ + Liquefaction allows the extraction of [#]($PURPLE)Alchemical Sulfur[#]() from matter. In the {0} a [#]($PURPLE)Solvent[#](), usually a type of acid, is used to dissolve the target object, then the resulting solution is heated to evaporate the solvent and leave behind the Sulfur. + """, + this.itemLink(ItemRegistry.LIQUEFACTION_CAULDRON.get()) + ); + + this.context().page("multiblock"); + var multiblock = BookMultiblockPageModel.builder() + .withMultiblockId(Theurgy.loc("placement/liquefaction_cauldron")) + .build(); + + this.context().page("usage"); + var usage = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "Usage"); + this.add(this.context().pageText(), + """ + Place the {0} on top of a {1}, and fill it with a Solvent by right-clicking with a solvent-filled bucket. + \\ + \\ + Then insert the item to liquefy by right-clicking the cauldron with it. + \\ + \\ + See also {2}. + """, + this.itemLink(ItemRegistry.LIQUEFACTION_CAULDRON.get()), + this.itemLink(ItemRegistry.PYROMANTIC_BRAZIER.get()), + this.entryLink("Alchemical Apparatus", GettingStartedCategoryProvider.CATEGORY_ID, "apparatus_how_to") + ); + + this.context().page("recipe"); + var recipe = BookCraftingRecipePageModel.builder() + .withRecipeId1(Theurgy.loc("crafting/shaped/liquefaction_cauldron")) + .build(); + //no text + +// this.context().page("sample_recipe"); +// var sampleRecipe = BookLiquefactionRecipePageModel.builder() +// .withTitle1(this.context().pageTitle()) +// .withRecipeId1(Theurgy.loc("liquefaction/wheat")) +// .build(); +// this.add(this.context().pageTitle(), "Sample Recipe"); +// //no text + + this.context().page("working"); + var working = BookImagePageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .withImages(this.modLoc("textures/gui/book/liquefaction_cauldron_working.png")) + .build(); + this.add(this.context().pageTitle(), "Working Correctly"); + this.add(this.context().pageText(), + """ + If the {0} is working properly, it will show bubbles. + """, + this.itemLink(ItemRegistry.LIQUEFACTION_CAULDRON.get()) + ); + + return this.entry(location) + .withIcon(ItemRegistry.LIQUEFACTION_CAULDRON.get()) + .withEntryBackground(EntryBackground.DEFAULT) + .withPages( + intro, + multiblock, + usage, + recipe, +// sampleRecipe + working + ); + } + + private BookEntryModel makeDistillerEntry(char location) { + this.context().entry("distiller"); + this.add(this.context().entryName(), "Distiller"); + this.add(this.context().entryDescription(), "Making Mercury"); + + this.context().page("intro"); + var intro = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "Distiller"); + this.add(this.context().pageText(), + """ + Distillation allows to obtain purified [#]($PURPLE)Alchemical Mercury[#]() from matter. To this end the object is heated until it dissolves into a gaseous form and the resulting vapour is condensed into crystals. The Mercury obtained this way is stable and can be used in alchemical recipes. + """); + //TODO: link to mercury energy stuff + //TODO: Link to matter teleportation u sing mercury + + this.context().page("multiblock"); + var multiblock = BookMultiblockPageModel.builder() + .withMultiblockId(Theurgy.loc("placement/distiller")) + .build(); + + this.context().page("usage"); + var usage = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "Usage"); + this.add(this.context().pageText(), + """ + Place the {0} on top of a {1}, then insert the item to distill by right-clicking the Distiller with it. + \\ + \\ + Alternatively a hopper can be used to insert items to process. + \\ + \\ + See also {2}. + """, + this.itemLink(ItemRegistry.DISTILLER.get()), + this.itemLink(ItemRegistry.PYROMANTIC_BRAZIER.get()), + this.entryLink("Alchemical Apparatus", GettingStartedCategoryProvider.CATEGORY_ID, "apparatus_how_to") + ); + + this.context().page("recipe"); + var recipe = BookCraftingRecipePageModel.builder() + .withRecipeId1(Theurgy.loc("crafting/shaped/distiller")) + .build(); + //no text + +// this.context().page("sample_recipe"); +// var sampleRecipe = BookDistillationRecipePageModel.builder() +// .withTitle1(this.context().pageTitle()) +// .withRecipeId1(Theurgy.loc("distillation/stone")) +// .build(); +// this.add(this.context().pageTitle(), "Sample Recipe"); +// //no text + + this.context().page("working"); + var working = BookImagePageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .withImages(this.modLoc("textures/gui/book/distiller_working.png")) + .build(); + this.add(this.context().pageTitle(), "Working Correctly"); + this.add(this.context().pageText(), + """ + If the {0} is working properly, it will float with a bobbing motion. + """, + this.itemLink(ItemRegistry.DISTILLER.get()) + ); + + return this.entry(location) + .withIcon(ItemRegistry.DISTILLER.get()) + .withEntryBackground(EntryBackground.DEFAULT) + .withPages( + intro, + multiblock, + usage, + recipe, +// sampleRecipe + working + ); + } + + private BookEntryModel makeIncubatorEntry(char location) { + this.context().entry("incubator"); + this.add(this.context().entryName(), "Incubator"); + this.add(this.context().entryDescription(), "Making Matter"); + + this.context().page("intro"); + var intro = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "Incubator"); + this.add(this.context().pageText(), + """ + Incubation is the process of *recombination* of the Principles of Matter into actual objects.\\ + The Incubator has one vessel for each of the Principles, and a central chamber where the recombination takes place. + """); + + this.context().page("multiblock"); + var multiblock = BookMultiblockPageModel.builder() + .withMultiblockId(Theurgy.loc("placement/incubator")) + .build(); + + this.context().page("usage"); + var usage = BookTextPageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .build(); + this.add(this.context().pageTitle(), "Usage"); + this.add(this.context().pageText(), + """ + Place the {0} on top of a {1} and one of each of the three vessels next to it. Insert the items to process by right-clicking the vessels with them. + \\ + \\ + Alternatively a hopper can be used to insert items to process.\\ + See also {2}. + """, + this.itemLink(ItemRegistry.INCUBATOR.get()), + this.itemLink(ItemRegistry.PYROMANTIC_BRAZIER.get()), + this.entryLink("Alchemical Apparatus", GettingStartedCategoryProvider.CATEGORY_ID, "apparatus_how_to") + ); + + this.context().page("recipe_incubator"); + var recipeIncubator = BookCraftingRecipePageModel.builder() + .withRecipeId1(Theurgy.loc("crafting/shaped/incubator")) + .build(); + //no text + + this.context().page("recipe_mercury_vessel"); + var recipeMercuryVessel = BookCraftingRecipePageModel.builder() + .withRecipeId1(Theurgy.loc("crafting/shaped/incubator_mercury_vessel")) + .build(); + //no text + + this.context().page("recipe_salt_vessel"); + var recipeSaltVessel = BookCraftingRecipePageModel.builder() + .withRecipeId1(Theurgy.loc("crafting/shaped/incubator_salt_vessel")) + .build(); + //no text + + this.context().page("recipe_sulfur_vessel"); + var recipeSulfurVessel = BookCraftingRecipePageModel.builder() + .withRecipeId1(Theurgy.loc("crafting/shaped/incubator_sulfur_vessel")) + .build(); + //no text + +// this.context().page("sample_recipe"); +// var sampleRecipe = BookIncubationRecipePageModel.builder() +// .withTitle1(this.context().pageTitle()) +// .withRecipeId1(Theurgy.loc("incubation/wheat")) +// .build(); +// this.add(this.context().pageTitle(), "Sample Recipe"); +// //no text + + this.context().page("working"); + var working = BookImagePageModel.builder() + .withTitle(this.context().pageTitle()) + .withText(this.context().pageText()) + .withImages(this.modLoc("textures/gui/book/incubator_working.png")) + .build(); + this.add(this.context().pageTitle(), "Working Correctly"); + this.add(this.context().pageText(), + """ + If the {0} is working properly, it will show smoke. + """, + this.itemLink(ItemRegistry.INCUBATOR.get()) + ); + + return this.entry(location) + .withIcon(ItemRegistry.INCUBATOR.get()) + .withEntryBackground(EntryBackground.DEFAULT) + .withPages( + intro, + multiblock, + usage, + recipeIncubator, + recipeMercuryVessel, + recipeSaltVessel, + recipeSulfurVessel, +// sampleRecipe + working + ); + } + + private BookEntryModel makeOreRefiningLinkEntry(char location) { + this.context().entry("about_ore_refining_link"); + this.add(this.context().entryName(), "Ore Refining"); + this.add(this.context().entryDescription(), "Return to the Getting Started Category to learn about Ore Refining"); + + return this.entry(location).withIcon(Items.RAW_IRON) + .withCategoryToOpen(Theurgy.loc(GettingStartedCategoryProvider.CATEGORY_ID)) + .withEntryBackground(EntryBackground.LINK_TO_CATEGORY); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/TheurgyBookProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/book/TheurgyBookProvider.java similarity index 75% rename from src/main/java/com/klikli_dev/theurgy/datagen/TheurgyBookProvider.java rename to src/main/java/com/klikli_dev/theurgy/datagen/book/TheurgyBookProvider.java index 11ded380a..3f97e44e7 100644 --- a/src/main/java/com/klikli_dev/theurgy/datagen/TheurgyBookProvider.java +++ b/src/main/java/com/klikli_dev/theurgy/datagen/book/TheurgyBookProvider.java @@ -1,15 +1,14 @@ /* - * SPDX-FileCopyrightText: 2022 klikli-dev + * SPDX-FileCopyrightText: 2023 klikli-dev * * SPDX-License-Identifier: MIT */ -package com.klikli_dev.theurgy.datagen; +package com.klikli_dev.theurgy.datagen.book; import com.klikli_dev.modonomicon.api.datagen.BookProvider; import com.klikli_dev.modonomicon.api.datagen.book.BookModel; import com.klikli_dev.theurgy.Theurgy; -import com.klikli_dev.theurgy.datagen.book.GettingStartedCategoryProvider; import net.minecraft.data.PackOutput; import net.minecraftforge.common.data.LanguageProvider; @@ -23,7 +22,6 @@ protected void registerDefaultMacros() { this.registerDefaultMacro("$PURPLE", "ad03fc"); } - @Override protected BookModel generateBook() { this.lang.add(this.context().bookName(), "The Hermetica"); @@ -31,14 +29,17 @@ protected BookModel generateBook() { int categorySortNum = 1; var gettingStartedCategory = new GettingStartedCategoryProvider(this).generate().withSortNumber(categorySortNum++); + var spagyricsCategory = new SpagyricsCategoryProvider(this).generate().withSortNumber(categorySortNum++); + spagyricsCategory.withCondition(this.condition().entryRead(this.modLoc(GettingStartedCategoryProvider.CATEGORY_ID + "/spagyrics"))); var book = BookModel.create( - this.modLoc(this.context.bookId()), + this.modLoc(this.context().bookId()), this.context().bookName() ) .withTooltip(this.context().bookTooltip()) .withCategories( - gettingStartedCategory + gettingStartedCategory, + spagyricsCategory ) .withGenerateBookItem(true) .withModel(this.modLoc("the_hermetica_icon")) diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/lang/ENUSProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/lang/ENUSProvider.java index dd8d8a4a7..214d10cdf 100644 --- a/src/main/java/com/klikli_dev/theurgy/datagen/lang/ENUSProvider.java +++ b/src/main/java/com/klikli_dev/theurgy/datagen/lang/ENUSProvider.java @@ -8,27 +8,67 @@ import com.klikli_dev.theurgy.Theurgy; import com.klikli_dev.theurgy.TheurgyConstants; +import com.klikli_dev.theurgy.content.item.AlchemicalSaltItem; +import com.klikli_dev.theurgy.content.item.AlchemicalSulfurItem; +import com.klikli_dev.theurgy.registry.BlockRegistry; import com.klikli_dev.theurgy.registry.ItemRegistry; +import com.klikli_dev.theurgy.registry.SaltRegistry; +import com.klikli_dev.theurgy.registry.SulfurRegistry; import net.minecraft.ChatFormatting; -import net.minecraft.data.DataGenerator; +import net.minecraft.Util; import net.minecraft.data.PackOutput; -import net.minecraft.network.chat.contents.TranslatableContents; +import net.minecraft.tags.ItemTags; +import net.minecraft.world.item.Item; import net.minecraftforge.common.data.LanguageProvider; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; + +import java.text.MessageFormat; +import java.util.function.Supplier; public class ENUSProvider extends LanguageProvider implements TooltipLanguageProvider { public ENUSProvider(PackOutput packOutput) { super(packOutput, Theurgy.MODID, "en_us"); } + protected String f(String pattern, Object... arguments) { + return MessageFormat.format(pattern, arguments); + } + + protected String green(String text) { + return ChatFormatting.GREEN + text + ChatFormatting.RESET + ChatFormatting.GRAY; + } + + protected String darkRed(String text) { + return ChatFormatting.DARK_RED + text + ChatFormatting.RESET + ChatFormatting.GRAY; + } + private void addMisc() { this.add(TheurgyConstants.I18n.Tooltip.SHOW_EXTENDED, ChatFormatting.GOLD + "[" + ChatFormatting.LIGHT_PURPLE + "shift " + - ChatFormatting.GRAY + "read more" + + ChatFormatting.GRAY + "show more" + + ChatFormatting.GOLD + "]"); + this.add(TheurgyConstants.I18n.Tooltip.EXTENDED_HEADING, ChatFormatting.GOLD + "[" + + ChatFormatting.GRAY + "more" + ChatFormatting.GOLD + "]"); + this.add(TheurgyConstants.I18n.Tooltip.SHOW_USAGE, ChatFormatting.GOLD + "[" + ChatFormatting.LIGHT_PURPLE + "ctrl " + ChatFormatting.GRAY + "show usage" + ChatFormatting.GOLD + "]"); + this.add(TheurgyConstants.I18n.Tooltip.USAGE_HEADING, ChatFormatting.GOLD + "[" + + ChatFormatting.GRAY + "usage" + + ChatFormatting.GOLD + "]"); + + this.add(TheurgyConstants.I18n.Misc.UNIT_MILLIBUCKETS, "%smB"); + } + + private void addJEI() { + this.add(TheurgyConstants.I18n.JEI.CALCINATION_CATEGORY, "Calcination"); + this.add(TheurgyConstants.I18n.JEI.LIQUEFACTION_CATEGORY, "Liquefaction"); + this.add(TheurgyConstants.I18n.JEI.DISTILLATION_CATEGORY, "Distillation"); + this.add(TheurgyConstants.I18n.JEI.INCUBATION_CATEGORY, "Incubation"); + this.add(TheurgyConstants.I18n.JEI.ACCUMULATION_CATEGORY, "Accumulation"); } private void addSubtitles() { @@ -36,78 +76,359 @@ private void addSubtitles() { } private void addMessages() { - this.add(TheurgyConstants.I18n.Message.DIVINATION_ROD_LINKED, ChatFormatting.GREEN +"Success"+ChatFormatting.RESET +": The divination rod is now attuned to %s."); - this.add(TheurgyConstants.I18n.Message.DIVINATION_ROD_TIER_TOO_LOW, ChatFormatting.DARK_RED +"Warning"+ChatFormatting.RESET +": You need a higher tier divination rod to attune to %s."); - this.add(TheurgyConstants.I18n.Message.DIVINATION_ROD_BLOCK_NOT_ALLOWED, ChatFormatting.DARK_RED +"Warning"+ChatFormatting.RESET +": The divination rod cannot be attuned to this type of block: %s."); - this.add(TheurgyConstants.I18n.Message.DIVINATION_ROD_BLOCK_DISALLOWED, ChatFormatting.DARK_RED +"Warning"+ChatFormatting.RESET +": The divination rod cannot be attuned to this type of block: %s."); + this.add(TheurgyConstants.I18n.Message.DIVINATION_ROD_LINKED, this.f("{0}: The divination rod is now attuned to %s.", this.green("Success"))); + + this.add(TheurgyConstants.I18n.Message.DIVINATION_ROD_TIER_TOO_LOW, this.f("{0}: You need a higher tier divination rod to attune to %s.", this.darkRed("Warning"))); + this.add(TheurgyConstants.I18n.Message.DIVINATION_ROD_BLOCK_NOT_ALLOWED, this.f("{0}: The divination rod cannot be attuned to this type of block: %s.", this.darkRed("Warning"))); + this.add(TheurgyConstants.I18n.Message.DIVINATION_ROD_BLOCK_DISALLOWED, this.f("{0}: The divination rod cannot be attuned to this type of block: %s.", this.darkRed("Warning"))); this.add(TheurgyConstants.I18n.Message.DIVINATION_ROD_NO_LINK, "The divination rod is not attuned to any material."); - this.add(TheurgyConstants.I18n.Message.DIVINATION_ROD_ATTUNING_NOT_ALLOWED, ChatFormatting.DARK_RED +"Warning"+ChatFormatting.RESET +": This type of divination rod cannot be manually attuned."); + this.add(TheurgyConstants.I18n.Message.DIVINATION_ROD_ATTUNING_NOT_ALLOWED, this.f("{0}: This type of divination rod cannot be manually attuned.", this.darkRed("Warning"))); } - private void addItems() { - this.add(TheurgyConstants.I18n.ITEM_GROUP, "Theurgy"); + private void addFluids() { + this.add("fluid_type.theurgy.sal_ammoniac", "Sal Ammoniac"); + } - this.addItem(ItemRegistry.EMPTY_JAR, "Empty Jar"); + private void addBlocks() { + this.addBlock(BlockRegistry.CALCINATION_OVEN, "Calcination Oven"); + this.addTooltip(BlockRegistry.CALCINATION_OVEN.get()::asItem, + "A device to extract Alchemical Salt from Items.", + "Salt represents the \"body\" or \"physical matter\" of an object.", + this.f( + """ + Place this on top of a heating device such as a Pyromantic Brazier. + {0} with ingredients to place them in the oven for processing. + """, + this.green("Right-Click"))); - this.addItem(ItemRegistry.EMPTY_JAR_LABELED, "Labeled Empty Jar"); - this.addTooltip(ItemRegistry.EMPTY_JAR_LABELED, "Dummy item for rendering Alchemical Sulfur if source items are not shown."); + this.addBlock(BlockRegistry.PYROMANTIC_BRAZIER, "Pyromantic Brazier"); + this.addTooltip(BlockRegistry.PYROMANTIC_BRAZIER.get()::asItem, + "A simple device to heat alchemical apparati.", + "Place this below other alchemical apparati to heat them up", + this.f("{0} with a fuel item to insert it (or using a hopper)", this.green("Right-Click"))); - this.addItem(ItemRegistry.JAR_LABEL, "Jar Label"); - this.addTooltip(ItemRegistry.JAR_LABEL, "Dummy item for rendering Alchemical Sulfur if source items are shown."); + this.addBlock(BlockRegistry.LIQUEFACTION_CAULDRON, "Liquefaction Cauldron"); + this.addTooltip(BlockRegistry.LIQUEFACTION_CAULDRON.get()::asItem, + "A device to extract Alchemical Sulfur from Items using a Solvent.", + "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation.", + this.f( + """ + Place this on top of a heating device such as a Pyromantic Brazier. + {0} with ingredients to add them to the cauldron for processing. + """, + this.green("Right-Click"))); + + this.addBlock(BlockRegistry.DISTILLER, "Mercury Distiller"); + this.addTooltip(BlockRegistry.DISTILLER.get()::asItem, + "A device to extract Alchemical Mercury from Items.", + "Mercury represents the \"energy\" of an object. It has applications both as an energy source and as a catalyst.", + this.f( + """ + Place this on top of a heating device such as a Pyromantic Brazier. + {0} with ingredients to add them to the distiller for processing. + """, + this.green("Right-Click"))); + + this.addBlock(BlockRegistry.INCUBATOR, "Incubator"); + this.addTooltip(BlockRegistry.INCUBATOR.get()::asItem, + "A device to recombine Alchemical Sulfur, Salt and Mercury into items.", + null, + """ + Place this on top of a heating device such as a Pyromantic Brazier. + Needs Incubator Vessels for all three ingredient types adjacent horizontally to the incubator. + """); + + this.addBlock(BlockRegistry.INCUBATOR_MERCURY_VESSEL, "Incubator Mercury Vessel"); + this.addTooltip(BlockRegistry.INCUBATOR_MERCURY_VESSEL.get()::asItem, + "A vessel to hold Mercury for the Incubator.", + null, + this.f(""" + Place horizontally next to the incubator. + {0} with Alchemical Mercury to fill the vessel to allow the Incubator to process it. + """, + this.green("Right-Click"))); + this.addBlock(BlockRegistry.INCUBATOR_SALT_VESSEL, "Incubator Salt Vessel"); + this.addTooltip(BlockRegistry.INCUBATOR_SALT_VESSEL.get()::asItem, + "A vessel to hold Salt for the Incubator.", + null, + this.f(""" + Place horizontally next to the incubator. + {0} with Alchemical Salt to fill the vessel to allow the Incubator to process it. + """, + this.green("Right-Click"))); + this.addBlock(BlockRegistry.INCUBATOR_SULFUR_VESSEL, "Incubator Sulfur Vessel"); + this.addTooltip(BlockRegistry.INCUBATOR_SULFUR_VESSEL.get()::asItem, + "A vessel to hold Sulfur for the Incubator.", + null, + this.f(""" + Place horizontally next to the incubator. + {0} with Alchemical Sulfur to fill the vessel to allow the Incubator to process it. + """, + this.green("Right-Click"))); + + this.addBlock(BlockRegistry.SAL_AMMONIAC_ACCUMULATOR, "Sal Ammoniac Accumulator"); + this.addTooltip(BlockRegistry.SAL_AMMONIAC_ACCUMULATOR.get()::asItem, + "A simple device to increase the concentration of residual Sal Ammoniac in water by evaporation.", + "The resulting concentrated Sal Ammoniac fluid is a solvent that can be used in Liquefaction Cauldrons.", + this.f(""" + Place this on top of a heating device such as a Pyromantic Brazier. + {0} with water buckets to fill the accumulator. + The water will be consumed to fill the accumulator. + You can additionally add Sal Ammoniac Crystals to speed up the process. + """, + this.green("Right-Click"))); + + this.addBlock(BlockRegistry.SAL_AMMONIAC_TANK, "Sal Ammoniac Tank"); + this.addTooltip(BlockRegistry.SAL_AMMONIAC_TANK.get()::asItem, + "A tank to store concentrated Sal Ammoniac fluid.", + "Sal Ammoniac is a solvent that can be used in Liquefaction Cauldrons.", + """ + Place this below a filled Sal Ammoniac Accumulator. + The Tank will slowly be filled with Sal Ammoniac. + """); + + this.addBlock(BlockRegistry.SAL_AMMONIAC_ORE, "Sal Ammoniac Ore"); + this.addExtendedTooltip(BlockRegistry.SAL_AMMONIAC_ORE.get()::asItem, + "Ore that yields Sal Ammoniac Crystals for use in a Sal Ammoniac Accumulator."); + + this.addBlock(BlockRegistry.DEEPSLATE_SAL_AMMONIAC_ORE, "Deepslate Sal Ammoniac Ore"); + this.addExtendedTooltip(BlockRegistry.DEEPSLATE_SAL_AMMONIAC_ORE.get()::asItem, + "Ore that yields Sal Ammoniac Crystals for use in a Sal Ammoniac Accumulator."); + } + + private void addSulfurs() { + this.add(TheurgyConstants.I18n.Item.ALCHEMICAL_SULFUR_UNKNOWN_SOURCE, "Unknown Source"); + + //Automatic sulfur name rendering + SulfurRegistry.SULFURS.getEntries().stream().map(RegistryObject::get).map(AlchemicalSulfurItem.class::cast).forEach(sulfur -> { + if (sulfur.useAutomaticNameRendering) { + this.addItem(() -> sulfur, "Alchemical Sulfur %s"); + } + if (sulfur.provideAutomaticTooltipData) { + this.addTooltip(() -> sulfur, + "Alchemical Sulfur crafted from %s.", + null, + "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation."); + } + }); + + //Tag Names for Sulfurs with overrideTagSourceName + this.add(Util.makeDescriptionId("tag", ItemTags.LOGS.location()), "Logs"); + //Note: It was considered to try and warn here if a sulfur has overrideTagSourceName set to true, but no override lang key set. + // This is not possible, however, as the tag source comes from item nbt that is not available at this point. + + + //Names for Sulfurs with overrideSourceName + //Common Metals + this.addSulfurSource(SulfurRegistry.IRON, "Iron"); + this.addSulfurSource(SulfurRegistry.COPPER, "Copper"); + this.addSulfurSource(SulfurRegistry.SILVER, "Silver"); + this.addSulfurSource(SulfurRegistry.GOLD, "Gold"); + this.addSulfurSource(SulfurRegistry.NETHERITE, "Netherite"); + this.addSulfurSource(SulfurRegistry.URANIUM, "Uranium"); + this.addSulfurSource(SulfurRegistry.AZURE_SILVER, "Azure Silver"); + this.addSulfurSource(SulfurRegistry.ZINC, "Zinc"); + this.addSulfurSource(SulfurRegistry.OSMIUM, "Osmium"); + this.addSulfurSource(SulfurRegistry.NICKEL, "Nickel"); + this.addSulfurSource(SulfurRegistry.LEAD, "Lead"); + this.addSulfurSource(SulfurRegistry.ALLTHEMODIUM, "Allthemodium"); + this.addSulfurSource(SulfurRegistry.UNOBTAINIUM, "Unobtainium"); + this.addSulfurSource(SulfurRegistry.IRIDIUM, "Iridium"); + this.addSulfurSource(SulfurRegistry.TIN, "Tin"); + this.addSulfurSource(SulfurRegistry.CINNABAR, "Cinnabar"); + this.addSulfurSource(SulfurRegistry.CRIMSON_IRON, "Crimson Iron"); + this.addSulfurSource(SulfurRegistry.PLATINUM, "Platinum"); + this.addSulfurSource(SulfurRegistry.VIBRANIUM, "Vibranium"); + + //Common Gems + this.addSulfurSource(SulfurRegistry.DIAMOND, "Diamond"); + this.addSulfurSource(SulfurRegistry.EMERALD, "Emerald"); + this.addSulfurSource(SulfurRegistry.LAPIS, "Lapis"); + this.addSulfurSource(SulfurRegistry.QUARTZ, "Quartz"); + this.addSulfurSource(SulfurRegistry.AMETHYST, "Amethyst"); + this.addSulfurSource(SulfurRegistry.PRISMARINE, "Prismarine"); + this.addSulfurSource(SulfurRegistry.RUBY, "Ruby"); + this.addSulfurSource(SulfurRegistry.APATITE, "Apatite"); + this.addSulfurSource(SulfurRegistry.PERIDOT, "Peridot"); + this.addSulfurSource(SulfurRegistry.FLUORITE, "Fluorite"); + this.addSulfurSource(SulfurRegistry.SAPPHIRE, "Sapphire"); + this.addSulfurSource(SulfurRegistry.SAL_AMMONIAC, "Sal Ammoniac"); + + //Other Common Minerals + this.addSulfurSource(SulfurRegistry.REDSTONE, "Redstone"); + this.addSulfurSource(SulfurRegistry.COAL, "Coal"); + this.addSulfurSource(SulfurRegistry.SULFUR, "Sulfur"); + } - this.addItem(ItemRegistry.ALCHEMICAL_SULFUR, "Alchemical Sulfur %s"); - this.addTooltip(ItemRegistry.ALCHEMICAL_SULFUR, - "Alchemical sulfur crafted from %s.", - "Sulfur represents the \"idea\" or \"soul\" of an object and is the key to replication and transmutation."); + private void addSalts() { + //Salt source names used in automatic name rendering + this.addSaltSource(SaltRegistry.MINERAL, "Minerals"); + this.addSaltSource(SaltRegistry.CROPS, "Crops"); + this.addSaltSource(SaltRegistry.STRATA, "Strata"); + this.addExtendedTooltip(SaltRegistry.STRATA.get()::asItem, + "Salt extracted from the strata, that is, sedimentary rock, soil, clay and so on."); + //Automatic salt name rendering + SaltRegistry.SALTS.getEntries().stream().map(RegistryObject::get).map(AlchemicalSaltItem.class::cast).forEach(salt -> { - this.add(TheurgyConstants.I18n.Tooltip.DIVINATION_ROD_NO_LINK, "The divination rod is "+ ChatFormatting.RED +"not attuned"+ ChatFormatting.RESET +" to any material."); + this.addItem(() -> salt, "Alchemical Salt %s"); + + this.addTooltip(() -> salt, + "Alchemical Salt calcinated from %s.", + null, + "Salt represents the \"body\" or \"physical matter\" of an object."); + }); + + } + + public void addSaltSource(Supplier key, String name) { + this.add(key.get().getDescriptionId() + TheurgyConstants.I18n.Item.ALCHEMICAL_SALT_SOURCE_SUFFIX, name); + } + + public void addSulfurSource(Supplier key, String name) { + this.add(key.get().getDescriptionId() + TheurgyConstants.I18n.Item.ALCHEMICAL_SULFUR_SOURCE_SUFFIX, name); + } + + + public void addIngredientInfo(Supplier ingredient, String info) { + this.add("jei." + Theurgy.MODID + ".ingredient." + ForgeRegistries.ITEMS.getKey(ingredient.get()).getPath() + ".description", info); + } + + private void addDivinationRods() { + this.add(TheurgyConstants.I18n.Tooltip.DIVINATION_ROD_NO_LINK, "The divination rod is " + ChatFormatting.RED + "not attuned" + ChatFormatting.RESET + " to any material."); this.add(TheurgyConstants.I18n.Tooltip.DIVINATION_ROD_LINKED_TO, "The divination rod is attuned to %s"); this.add(TheurgyConstants.I18n.Tooltip.DIVINATION_ROD_LAST_RESULT, "Found %s at %s."); + this.add(TheurgyConstants.I18n.Item.DIVINATION_ROD_UNKNOWN_LINKED_BLOCK, "Unknown Block (something went wrong)"); + + + var divinationRodUsage = this.f(""" + {0} a block to attune the rod to it. + {1} to let the rod search for blocks. + {2} after a successful search to let the rod show the last found block without consuming durability. + """, + this.green("Crouch-Click"), + this.green("Right-Click and hold"), + this.green("Right-Click without holding") + ); + + var sulfurAttunedDivinationRodUsage = this.f(""" + {0} the rod with a type of Alchemical Sulfur to attune the rod to it. + {1} to let the rod search for blocks. + {2} after a successful search to let the rod show the last found block without consuming durability. + """, + this.green("Craft"), + this.green("Right-Click and hold"), + this.green("Right-Click without holding") + ); + + var amethystDivinationRodUsage = this.f(""" + {0} the rod, it is automatically attuned to Amethyst. + {1} to let the rod search for blocks. + {2} after a successful search to let the rod show the last found block without consuming durability. + """, + this.green("Craft"), + this.green("Right-Click and hold"), + this.green("Right-Click without holding") + ); + this.addItem(ItemRegistry.DIVINATION_ROD_T1, "Glass Divination Rod"); this.add(ItemRegistry.DIVINATION_ROD_T1.get().getDescriptionId() + ".linked", "Glass Divination Rod %s"); //tooltip is handled by rod itself this.addExtendedTooltip(ItemRegistry.DIVINATION_ROD_T1, "Divination rods can be attuned to a block and are then used to find other blocks of the same type.", - ChatFormatting.GREEN + "Shift-Click"+ChatFormatting.GRAY + " a block to attune the rod to it.\n" + - ChatFormatting.GREEN + "Right-Click and hold"+ChatFormatting.GRAY +"to let the rod search for blocks.\n" + - ChatFormatting.GREEN + "Right-Click without holding"+ChatFormatting.GRAY + " after a successful search to let the rod show the last found block without consuming durability."); + divinationRodUsage); this.addItem(ItemRegistry.DIVINATION_ROD_T2, "Iron Divination Rod"); this.add(ItemRegistry.DIVINATION_ROD_T2.get().getDescriptionId() + ".linked", "Iron Divination Rod %s"); //tooltip is handled by rod itself this.addExtendedTooltip(ItemRegistry.DIVINATION_ROD_T2, "Divination rods can be attuned to a block and are then used to find other blocks of the same type.", - ChatFormatting.GREEN + "Shift-Click"+ChatFormatting.GRAY + " a block to attune the rod to it.\n" + - ChatFormatting.GREEN + "Right-Click and hold"+ChatFormatting.GRAY +"to let the rod search for blocks.\n" + - ChatFormatting.GREEN + "Right-Click without holding"+ChatFormatting.GRAY + " after a successful search to let the rod show the last found block without consuming durability."); + divinationRodUsage); this.addItem(ItemRegistry.DIVINATION_ROD_T3, "Diamond Divination Rod"); this.add(ItemRegistry.DIVINATION_ROD_T3.get().getDescriptionId() + ".linked", "Diamond Divination Rod %s"); //tooltip is handled by rod itself this.addExtendedTooltip(ItemRegistry.DIVINATION_ROD_T3, "Divination rods can be attuned to a block and are then used to find other blocks of the same type.", - ChatFormatting.GREEN + "Shift-Click"+ChatFormatting.GRAY + " a block to attune the rod to it.\n" + - ChatFormatting.GREEN + "Right-Click and hold"+ChatFormatting.GRAY +"to let the rod search for blocks.\n" + - ChatFormatting.GREEN + "Right-Click without holding"+ChatFormatting.GRAY + " after a successful search to let the rod show the last found block without consuming durability."); + divinationRodUsage); this.addItem(ItemRegistry.DIVINATION_ROD_T4, "Netherite Divination Rod"); this.add(ItemRegistry.DIVINATION_ROD_T4.get().getDescriptionId() + ".linked", "Netherite Divination Rod %s"); //tooltip is handled by rod itself this.addExtendedTooltip(ItemRegistry.DIVINATION_ROD_T4, "Divination rods can be attuned to a block and are then used to find other blocks of the same type.", - ChatFormatting.GREEN + "Shift-Click"+ChatFormatting.GRAY + " a block to attune the rod to it.\n" + - ChatFormatting.GREEN + "Right-Click and hold"+ChatFormatting.GRAY +"to let the rod search for blocks.\n" + - ChatFormatting.GREEN + "Right-Click without holding"+ChatFormatting.GRAY + " after a successful search to let the rod show the last found block without consuming durability."); + divinationRodUsage); + + this.addItem(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_ABUNDANT, "Divination Rod: Abundant Materials"); + this.add(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_ABUNDANT.get().getDescriptionId() + ".linked", "Divination Rod: Abundant Materials %s"); + this.addTooltip(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_ABUNDANT, + "A divination rod attuned to find abundant materials by crafting it with an abundant alchemical sulfur.", + "This type of divination rod is crafted pre-attuned to find blocks of the a specific type.", + sulfurAttunedDivinationRodUsage); + + this.addItem(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_COMMON, "Divination Rod: Common Materials"); + this.add(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_COMMON.get().getDescriptionId() + ".linked", "Divination Rod: Common Materials %s"); + this.addTooltip(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_COMMON, + "A divination rod attuned to find common materials by crafting it with a common alchemical sulfur.", + "This type of divination rod is crafted pre-attuned to find blocks of the a specific type.", + sulfurAttunedDivinationRodUsage); + + this.addItem(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_RARE, "Divination Rod: Rare Materials"); + this.add(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_RARE.get().getDescriptionId() + ".linked", "Divination Rod: Rare Materials %s"); + this.addTooltip(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_RARE, + "A divination rod attuned to find rare materials by crafting it with a rare alchemical sulfur.", + "This type of divination rod is crafted pre-attuned to find blocks of the a specific type.", + sulfurAttunedDivinationRodUsage); + + this.addItem(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_PRECIOUS, "Divination Rod: Precious Materials"); + this.add(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_PRECIOUS.get().getDescriptionId() + ".linked", "Divination Rod: Precious Materials %s"); + this.addTooltip(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_PRECIOUS, + "A divination rod attuned to find precious materials by crafting it with a precious alchemical sulfur.", + "This type of divination rod is crafted pre-attuned to find blocks of the a specific type.", + sulfurAttunedDivinationRodUsage); + + this.addItem(ItemRegistry.AMETHYST_DIVINATION_ROD, "Divination Rod: Amethyst"); + this.add(ItemRegistry.AMETHYST_DIVINATION_ROD.get().getDescriptionId() + ".linked", "Divination Rod: %s"); + this.addTooltip(ItemRegistry.AMETHYST_DIVINATION_ROD, + "A divination rod attuned to find amethyst.", + "This type of divination rod is crafted pre-attuned to find amethysts.", + amethystDivinationRodUsage); + } + + private void addItems() { + this.add(TheurgyConstants.I18n.ITEM_GROUP, "Theurgy"); + + this.addSalts(); + this.addSulfurs(); + this.addDivinationRods(); + + this.addItem(ItemRegistry.EMPTY_JAR, "Empty Jar"); + + this.addItem(ItemRegistry.EMPTY_JAR_LABELED, "Labeled Empty Jar"); + this.addTooltip(ItemRegistry.EMPTY_JAR_LABELED, "Dummy item for rendering Alchemical Sulfur if source items are not shown."); + + this.addItem(ItemRegistry.JAR_LABEL, "Jar Label"); + this.addTooltip(ItemRegistry.JAR_LABEL, "Dummy item for rendering Alchemical Sulfur if source items are shown."); + + + this.addItem(ItemRegistry.SAL_AMMONIAC_BUCKET, "Sal Ammoniac Bucket"); + + this.addItem(ItemRegistry.MERCURY_SHARD, "Mercury Shard"); + this.addExtendedTooltip(ItemRegistry.MERCURY_SHARD, + "Mercury shards are small pieces of Mercury in crystalline form. Their main uses are as ingredient in Digestion processes and as an energy source."); + + this.addItem(ItemRegistry.MERCURY_CRYSTAL, "Mercury Crystal"); + this.addExtendedTooltip(ItemRegistry.MERCURY_CRYSTAL, + "Mercury crystals are large pieces of Mercury in crystalline form. Their main uses are as ingredient in Digestion processes and as an energy source."); -// this.addItem(ItemRegistry.DIVINATION_ROD_T4, "Emerald Divination Rod"); -// this.add(ItemRegistry.DIVINATION_ROD_T4.get().getDescriptionId() + ".linked", "Emerald Divination Rod %s"); -// //tooltip is handled by rod itself -// this.addExtendedTooltip(ItemRegistry.DIVINATION_ROD_T4, -// "This divination rod type cannot be manually attuned, instead comes pre-attuned after crafting..", -// ChatFormatting.GREEN + "Right-Click and hold"+ChatFormatting.GRAY +" to let the rod search for blocks.\n" + -// ChatFormatting.GREEN + "Right-Click without holding"+ChatFormatting.GRAY + " after a successful search to let the rod show the last found block without consuming durability."); + this.addItem(ItemRegistry.SAL_AMMONIAC_CRYSTAL, "Sal Ammoniac Crystal"); + this.addExtendedTooltip(ItemRegistry.SAL_AMMONIAC_CRYSTAL, + """ + Obtained by mining Sal Ammoniac Ore. + Can be used in a Sal Ammoniac Accumulator to rapidly create Sal Ammoniac to be used as a solvent. + """); + this.addIngredientInfo(ItemRegistry.SAL_AMMONIAC_CRYSTAL, "Obtained by mining Sal Ammoniac Ore."); } @Override @@ -116,5 +437,8 @@ protected void addTranslations() { this.addSubtitles(); this.addMessages(); this.addItems(); + this.addBlocks(); + this.addFluids(); + this.addJEI(); } } diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/loot/TheurgyBlockLootSubProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/loot/TheurgyBlockLootSubProvider.java new file mode 100644 index 000000000..359b09645 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/loot/TheurgyBlockLootSubProvider.java @@ -0,0 +1,58 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.datagen.loot; + +import com.klikli_dev.theurgy.registry.BlockRegistry; +import com.klikli_dev.theurgy.registry.ItemRegistry; +import net.minecraft.data.loot.BlockLootSubProvider; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.flag.FeatureFlags; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; +import net.minecraft.world.level.storage.loot.LootTable; + +import java.util.Set; +import java.util.function.BiConsumer; + +public class TheurgyBlockLootSubProvider extends BlockLootSubProvider { + public TheurgyBlockLootSubProvider() { + super(Set.of(), FeatureFlags.REGISTRY.allFlags()); + } + + @Override + public void generate(BiConsumer consumer) { + this.generate(); + this.map.forEach(consumer::accept); + } + + @Override + protected void generate() { + this.dropSelf(BlockRegistry.PYROMANTIC_BRAZIER.get()); + this.dropDoubleBlockOnce(BlockRegistry.CALCINATION_OVEN.get()); + this.dropDoubleBlockOnce(BlockRegistry.LIQUEFACTION_CAULDRON.get()); + this.dropDoubleBlockOnce(BlockRegistry.DISTILLER.get()); + this.dropDoubleBlockOnce(BlockRegistry.INCUBATOR.get()); + this.dropSelf(BlockRegistry.INCUBATOR_MERCURY_VESSEL.get()); + this.dropSelf(BlockRegistry.INCUBATOR_SULFUR_VESSEL.get()); + this.dropSelf(BlockRegistry.INCUBATOR_SALT_VESSEL.get()); + this.dropSelf(BlockRegistry.SAL_AMMONIAC_ACCUMULATOR.get()); + this.dropSelf(BlockRegistry.SAL_AMMONIAC_TANK.get()); + + this.add(BlockRegistry.SAL_AMMONIAC_ORE.get(), (block) -> { + return this.createOreDrop(block, ItemRegistry.SAL_AMMONIAC_CRYSTAL.get()); + }); + this.add(BlockRegistry.DEEPSLATE_SAL_AMMONIAC_ORE.get(), (block) -> { + return this.createOreDrop(block, ItemRegistry.SAL_AMMONIAC_CRYSTAL.get()); + }); + } + + protected void dropDoubleBlockOnce(Block pBlock) { + this.add(pBlock, this.createSinglePropConditionTable(pBlock, BlockStateProperties.DOUBLE_BLOCK_HALF, DoubleBlockHalf.LOWER)); + } + +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/model/TheurgyBlockStateProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/model/TheurgyBlockStateProvider.java new file mode 100644 index 000000000..9dfb09e6f --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/model/TheurgyBlockStateProvider.java @@ -0,0 +1,242 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.datagen.model; + +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.content.apparatus.incubator.IncubatorBlock; +import com.klikli_dev.theurgy.content.apparatus.liquefactioncauldron.LiquefactionCauldronBlock; +import com.klikli_dev.theurgy.registry.BlockRegistry; +import net.minecraft.core.Direction; +import net.minecraft.data.PackOutput; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.level.block.PipeBlock; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; +import net.minecraftforge.client.model.generators.BlockStateProvider; +import net.minecraftforge.client.model.generators.ConfiguredModel; +import net.minecraftforge.client.model.generators.ModelFile; +import net.minecraftforge.client.model.generators.MultiPartBlockStateBuilder; +import net.minecraftforge.common.data.ExistingFileHelper; + +public class TheurgyBlockStateProvider extends BlockStateProvider { + public TheurgyBlockStateProvider(PackOutput packOutput, ExistingFileHelper exFileHelper) { + super(packOutput, Theurgy.MODID, exFileHelper); + } + + @Override + protected void registerStatesAndModels() { + this.registerCalcinationOven(); + this.registerPyromanticBrazier(); + this.registerLiquefactionCauldron(); + this.registerDistiller(); + this.registerIncubator(); + this.registerIncubatorVessels(); + this.registerSalAmmoniacAccumulator(); + this.registerSalAmmoniacTank(); + + this.simpleBlockWithItem(BlockRegistry.SAL_AMMONIAC_ORE.get(), this.cubeAll(BlockRegistry.SAL_AMMONIAC_ORE.get())); + this.simpleBlockWithItem(BlockRegistry.DEEPSLATE_SAL_AMMONIAC_ORE.get(), this.cubeAll(BlockRegistry.DEEPSLATE_SAL_AMMONIAC_ORE.get())); + } + + protected void registerSalAmmoniacAccumulator() { + var model = this.models().withExistingParent("sal_ammoniac_accumulator", this.modLoc("block/sal_ammoniac_accumulator_template")) + .ao(false) + //blockbench spits out garbage textures by losing the folder name so we fix them here + .texture("texture", this.modLoc("block/sal_ammoniac_accumulator")) + .texture("particle", this.mcLoc("block/copper_block")); + + //build blockstate + this.simpleBlock(BlockRegistry.SAL_AMMONIAC_ACCUMULATOR.get(), model); + + //add item model + this.itemModels().withExistingParent("sal_ammoniac_accumulator", this.modLoc("block/sal_ammoniac_accumulator")); + } + + protected void registerSalAmmoniacTank() { + + //tank is rendered by geckolib, so we just give a model with a particle texture + //we then use it for both the lit and unlit blockstate + var model = this.models().getBuilder("sal_ammoniac_tank").texture("particle", "minecraft:block/copper_block"); + + //build blockstate + this.simpleBlock(BlockRegistry.SAL_AMMONIAC_TANK.get(), model); + + //distiller needs an item model that allows geckolib to render + this.itemModels().getBuilder("sal_ammoniac_tank").parent(new ModelFile.UncheckedModelFile("builtin/entity")); + } + + protected void registerDistiller() { + + //distiller is rendered by geckolib, so we just give a model with a particle texture + //we then use it for both the lit and unlit blockstate + var model = this.models().getBuilder("distiller").texture("particle", "minecraft:block/copper_block"); + + //build blockstate + this.getVariantBuilder(BlockRegistry.DISTILLER.get()).forAllStates(s -> ConfiguredModel.builder() + .modelFile(model) + .build()); + + //distiller needs an item model that allows geckolib to render + this.itemModels().getBuilder("distiller").parent(new ModelFile.UncheckedModelFile("builtin/entity")); + } + + protected void registerIncubator() { + var lowerHalfModel = this.models().withExistingParent("incubator_lower", this.modLoc("block/incubator_template")) + .ao(false) + //blockbench spits out garbage textures by losing the folder name so we fix them here + .texture("texture", this.modLoc("block/incubator_gold")) + .texture("particle", this.mcLoc("block/copper_block")); + + //we use an empty upper half model that just shows the particle texture + var upperHalfModel = this.models().getBuilder("incubator_upper") + .ao(false) + .texture("particle", "minecraft:block/copper_block"); + + var pipeModel = this.models().withExistingParent("incubator_pipe", this.modLoc("block/incubator_pipe_template")) + .ao(false) + //blockbench spits out garbage textures by losing the folder name so we fix them here + .texture("texture", this.modLoc("block/incubator_pipe")) + .texture("particle", this.mcLoc("block/copper_block")); + + //build blockstate + MultiPartBlockStateBuilder incubatorBuilder = this.getMultipartBuilder(BlockRegistry.INCUBATOR.get()); + + //start with the main model, which only shows on the lower half + incubatorBuilder.part().modelFile(lowerHalfModel) + .addModel() + .condition(IncubatorBlock.HALF, DoubleBlockHalf.LOWER) + .end(); + + //now do the upper half model, which only shows on the upper half and is actually empty + incubatorBuilder.part().modelFile(upperHalfModel) + .addModel() + .condition(IncubatorBlock.HALF, DoubleBlockHalf.UPPER) + .end(); + + //finally do the pipe models, copied and adjusted from fourWayMultipart to only show on the lower half + PipeBlock.PROPERTY_BY_DIRECTION.entrySet().forEach(e -> { + Direction dir = e.getKey(); + if (dir.getAxis().isHorizontal()) { + incubatorBuilder.part().modelFile(pipeModel).rotationY((((int) dir.toYRot()) + 180) % 360).uvLock(true).addModel() + .condition(e.getValue(), true) + .condition(IncubatorBlock.HALF, DoubleBlockHalf.LOWER); + } + }); + + //add item model + this.itemModels().withExistingParent("incubator", lowerHalfModel.getLocation()) + .transforms() + //take defaults from net.minecraft:client:extra/assets/minecraft/models/block/block.json + //then slightly move down and reduce scale from 0.625 to 0.5 + .transform(ItemDisplayContext.GUI) + .rotation(30, 225, 0) + .translation(0, -2.0f, 0) + .scale(0.35f) + .end(); + } + + protected void registerIncubatorVessels() { + + //vessels are rendered by geckolib, so we just give a model with a particle texture + var incubatorVessel = this.models().getBuilder("incubator_vessel").texture("particle", "minecraft:block/copper_block"); + + //build blockstate + this.simpleBlock(BlockRegistry.INCUBATOR_MERCURY_VESSEL.get(), incubatorVessel); + this.simpleBlock(BlockRegistry.INCUBATOR_SALT_VESSEL.get(), incubatorVessel); + this.simpleBlock(BlockRegistry.INCUBATOR_SULFUR_VESSEL.get(), incubatorVessel); + + //vessels need item models that allow geckolib to render + this.itemModels().getBuilder("incubator_mercury_vessel").parent(new ModelFile.UncheckedModelFile("builtin/entity")); + this.itemModels().getBuilder("incubator_salt_vessel").parent(new ModelFile.UncheckedModelFile("builtin/entity")); + this.itemModels().getBuilder("incubator_sulfur_vessel").parent(new ModelFile.UncheckedModelFile("builtin/entity")); + } + + protected void registerLiquefactionCauldron() { + var lowerHalfModel = this.models().withExistingParent("liquefaction_cauldron_lower", this.modLoc("block/liquefaction_cauldron_template")) + .ao(false) + //blockbench spits out garbage textures by losing the folder name so we fix them here + .texture("texture", this.modLoc("block/liquefaction_cauldron")) + .texture("particle", this.mcLoc("block/copper_block")); + + + //we use an empty upper half model that just shows the particle texture + var upperHalfModel = this.models().getBuilder("liquefaction_cauldron_upper").texture("particle", "minecraft:block/copper_block"); + + //build blockstate + this.getVariantBuilder(BlockRegistry.LIQUEFACTION_CAULDRON.get()).forAllStates(s -> { + var model = s.getValue(LiquefactionCauldronBlock.HALF) == DoubleBlockHalf.LOWER ? lowerHalfModel : upperHalfModel; + return ConfiguredModel.builder() + .modelFile(model) + .build(); + } + ); + + //add item model + this.itemModels().withExistingParent("liquefaction_cauldron", lowerHalfModel.getLocation()) + .transforms() + //take defaults from net.minecraft:client:extra/assets/minecraft/models/block/block.json + //then slightly move down and reduce scale from 0.625 to 0.5 + .transform(ItemDisplayContext.GUI) + .rotation(30, 225, 0) + .translation(0, -2.0f, 0) + .scale(0.5f) + .end(); + } + + protected void registerCalcinationOven() { + //calcination oven is rendered by geckolib, so we just give an empty model with a particle texture + //we then use it for both the lit and unlit blockstate + var model = this.models().getBuilder("calcination_oven").texture("particle", "minecraft:block/copper_block"); + + //build blockstate + this.getVariantBuilder(BlockRegistry.CALCINATION_OVEN.get()).forAllStates(s -> ConfiguredModel.builder() + .modelFile(model) + .build()); + + //calcination oven needs an item model that allows geckolib to render + this.itemModels().getBuilder("calcination_oven").parent(new ModelFile.UncheckedModelFile("builtin/entity")); + } + + protected void registerPyromanticBrazier() { + var model = this.models().withExistingParent("pyromantic_brazier", this.modLoc("block/pyromantic_brazier_template")) + .ao(false) + //blockbench spits out garbage textures by losing the folder name so we fix them here + .texture("texture", this.modLoc("block/pyromantic_brazier")) + .texture("particle", this.mcLoc("block/copper_block")); + + var modelLit = this.models().withExistingParent("pyromantic_brazier_lit", this.modLoc("block/pyromantic_brazier_lit_template")) + .renderType("cutout_mipped") //also blockbench doesnt set render type + .texture("texture", this.modLoc("block/pyromantic_brazier_lit")) + .texture("particle", this.mcLoc("block/copper_block")) + .texture("fire", this.mcLoc("block/campfire_fire")); + + //build blockstate + this.getVariantBuilder(BlockRegistry.PYROMANTIC_BRAZIER.get()) // Get variant builder + .partialState() + .with(BlockStateProperties.LIT, false) + .modelForState()//start setting models + .modelFile(model) + .addModel()//finish setting models + .partialState() + .with(BlockStateProperties.LIT, true) + .modelForState()//start setting models + .modelFile(modelLit) + .addModel(); + + //add item model + this.itemModels().withExistingParent("pyromantic_brazier", this.modLoc("block/pyromantic_brazier")) + .transforms() + //take defaults from net.minecraft:client:extra/assets/minecraft/models/block/block.json + //then slightly move down and reduce scale from 0.625 to 0.5 + .transform(ItemDisplayContext.GUI) + .rotation(30, 225, 0) +// .translation(0, -2.0f, 0) + .scale(0.5f) + .end() + ; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/model/TheurgyItemModelProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/model/TheurgyItemModelProvider.java new file mode 100644 index 000000000..3c36f9770 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/model/TheurgyItemModelProvider.java @@ -0,0 +1,166 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.datagen.model; + +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.TheurgyConstants; +import com.klikli_dev.theurgy.content.item.AlchemicalSulfurItem; +import com.klikli_dev.theurgy.registry.ItemRegistry; +import com.klikli_dev.theurgy.registry.SaltRegistry; +import com.klikli_dev.theurgy.registry.SulfurRegistry; +import net.minecraft.data.PackOutput; +import net.minecraft.world.item.Item; +import net.minecraftforge.client.model.generators.ItemModelBuilder; +import net.minecraftforge.client.model.generators.ModelFile; +import net.minecraftforge.common.data.ExistingFileHelper; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; + +public class TheurgyItemModelProvider extends net.minecraftforge.client.model.generators.ItemModelProvider { + public TheurgyItemModelProvider(PackOutput packOutput, ExistingFileHelper existingFileHelper) { + super(packOutput, Theurgy.MODID, existingFileHelper); + } + + protected String name(Item item) { + return ForgeRegistries.ITEMS.getKey(item).getPath(); + } + + private ItemModelBuilder registerAlchemicalSalt(String name) { + return this.getBuilder(name) + .parent(new ModelFile.UncheckedModelFile(this.modLoc("item/alchemical_salt"))); + } + + private ItemModelBuilder registerItemGenerated(String name) { + return this.registerItemGenerated(name, name); + } + + private ItemModelBuilder registerItemGenerated(String name, String texture) { + return this.getBuilder(name) + .parent(new ModelFile.UncheckedModelFile("item/generated")) + .texture("layer0", this.modLoc("item/" + texture)); + } + + private void registerItemHandheld(String name) { + this.getBuilder(name) + .parent(new ModelFile.UncheckedModelFile("item/handheld")) + .texture("layer0", this.modLoc("item/" + name)); + } + + private void registerItemBuiltinEntity(String name) { + this.getBuilder(name) + .parent(new ModelFile.UncheckedModelFile("builtin/entity")); + } + + private void registerDivinationRod(Item divinationRodItem) { + + //somehow we have to prefix "item/" if we append "/0" instead of "_=". Probably something in the item builder or resource location logic it a "/" is present. Anyhow, this moves the variants into a subfolder + var variant0 = this.registerItemGenerated("item/" + this.name(divinationRodItem) + "/0", this.name(divinationRodItem) + "/divination_rod_0"); + var variant1 = this.registerItemGenerated("item/" + this.name(divinationRodItem) + "/1", this.name(divinationRodItem) + "/divination_rod_1"); + var variant2 = this.registerItemGenerated("item/" + this.name(divinationRodItem) + "/2", this.name(divinationRodItem) + "/divination_rod_2"); + var variant3 = this.registerItemGenerated("item/" + this.name(divinationRodItem) + "/3", this.name(divinationRodItem) + "/divination_rod_3"); + var variant4 = this.registerItemGenerated("item/" + this.name(divinationRodItem) + "/4", this.name(divinationRodItem) + "/divination_rod_4"); + var variant5 = this.registerItemGenerated("item/" + this.name(divinationRodItem) + "/5", this.name(divinationRodItem) + "/divination_rod_5"); + var variant6 = this.registerItemGenerated("item/" + this.name(divinationRodItem) + "/6", this.name(divinationRodItem) + "/divination_rod_6"); + var variant7 = this.registerItemGenerated("item/" + this.name(divinationRodItem) + "/7", this.name(divinationRodItem) + "/divination_rod_7"); + var searchingVariant = this.registerItemGenerated("item/" + this.name(divinationRodItem) + "/searching", this.name(divinationRodItem) + "/divination_rod_searching"); + + var name = this.name(divinationRodItem); + this.getBuilder(name) + .parent(variant0) + + .override() + .model(variant7) + .predicate(TheurgyConstants.ItemProperty.DIVINATION_DISTANCE, 0.0f) + .end() + + .override() + .model(variant6) + .predicate(TheurgyConstants.ItemProperty.DIVINATION_DISTANCE, 1.0f) + .end() + + .override() + .model(variant5) + .predicate(TheurgyConstants.ItemProperty.DIVINATION_DISTANCE, 2.0f) + .end() + + .override() + .model(variant4) + .predicate(TheurgyConstants.ItemProperty.DIVINATION_DISTANCE, 3.0f) + .end() + + .override() + .model(variant3) + .predicate(TheurgyConstants.ItemProperty.DIVINATION_DISTANCE, 4.0f) + .end() + + .override() + .model(variant2) + .predicate(TheurgyConstants.ItemProperty.DIVINATION_DISTANCE, 5.0f) + .end() + + .override() + .model(variant1) + .predicate(TheurgyConstants.ItemProperty.DIVINATION_DISTANCE, 6.0f) + .end() + + .override() + .model(variant0) + .predicate(TheurgyConstants.ItemProperty.DIVINATION_DISTANCE, 7.0f) + .end() + + .override() + .model(searchingVariant) + .predicate(TheurgyConstants.ItemProperty.DIVINATION_DISTANCE, 8.0f) + .end(); + } + + protected void registerSulfurs() { + //alchemical sulfur models + + SulfurRegistry.SULFURS.getEntries().stream().map(RegistryObject::get).map(AlchemicalSulfurItem.class::cast).forEach(sulfur -> { + if (sulfur.useAutomaticIconRendering) { + this.registerItemBuiltinEntity(this.name(sulfur)); + } + }); + } + + protected void registerSalts() { + this.registerItemGenerated("alchemical_salt"); //parent for alchemical salt + + //alchemical salt models + SaltRegistry.SALTS.getEntries().stream().map(RegistryObject::get).forEach(salt -> { + this.registerAlchemicalSalt(this.name(salt)); + }); + } + + @Override + protected void registerModels() { + this.registerItemGenerated(this.name(ItemRegistry.THE_HERMETICA_ICON.get()), "the_hermetica"); + + this.registerSulfurs(); + this.registerSalts(); + + this.registerItemGenerated(this.name(ItemRegistry.EMPTY_JAR.get())); + this.registerItemGenerated(this.name(ItemRegistry.EMPTY_JAR_LABELED.get())); + this.registerItemGenerated(this.name(ItemRegistry.JAR_LABEL.get())); + + this.registerItemGenerated(this.name(ItemRegistry.MERCURY_SHARD.get())); + this.registerItemGenerated(this.name(ItemRegistry.MERCURY_CRYSTAL.get())); + + this.registerItemGenerated(this.name(ItemRegistry.SAL_AMMONIAC_CRYSTAL.get())); + + this.registerDivinationRod(ItemRegistry.DIVINATION_ROD_T1.get()); + this.registerDivinationRod(ItemRegistry.DIVINATION_ROD_T2.get()); + this.registerDivinationRod(ItemRegistry.DIVINATION_ROD_T3.get()); + this.registerDivinationRod(ItemRegistry.DIVINATION_ROD_T4.get()); + this.registerDivinationRod(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_ABUNDANT.get()); + this.registerDivinationRod(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_COMMON.get()); + this.registerDivinationRod(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_RARE.get()); + this.registerDivinationRod(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_PRECIOUS.get()); + this.registerDivinationRod(ItemRegistry.AMETHYST_DIVINATION_ROD.get()); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/multiblock/TheurgyMultiblockProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/multiblock/TheurgyMultiblockProvider.java new file mode 100644 index 000000000..cb91b7e62 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/multiblock/TheurgyMultiblockProvider.java @@ -0,0 +1,85 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.datagen.multiblock; + +import com.klikli_dev.modonomicon.api.datagen.MultiblockProvider; +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.registry.BlockRegistry; +import net.minecraft.data.PackOutput; + +public class TheurgyMultiblockProvider extends MultiblockProvider { + + public TheurgyMultiblockProvider(PackOutput packOutput) { + super(packOutput, Theurgy.MODID); + } + + @Override + public void buildMultiblocks() { + this.add(this.modLoc("placement/pyromantic_brazier"), + new DenseMultiblockBuilder() + .layer("0") + .block('0', BlockRegistry.PYROMANTIC_BRAZIER) + .build() + ); + + this.add(this.modLoc("placement/calcination_oven"), + new DenseMultiblockBuilder() + .layer("0") + .layer("b") + .block('b', BlockRegistry.PYROMANTIC_BRAZIER) + .block('0', BlockRegistry.CALCINATION_OVEN) + .build() + ); + + this.add(this.modLoc("placement/liquefaction_cauldron"), + new DenseMultiblockBuilder() + .layer("0") + .layer("b") + .block('b', BlockRegistry.PYROMANTIC_BRAZIER) + .block('0', BlockRegistry.LIQUEFACTION_CAULDRON) + .build() + ); + + this.add(this.modLoc("placement/distiller"), + new DenseMultiblockBuilder() + .layer("0") + .layer("b") + .block('b', BlockRegistry.PYROMANTIC_BRAZIER) + .block('0', BlockRegistry.DISTILLER) + .build() + ); + + this.add(this.modLoc("placement/incubator"), + new DenseMultiblockBuilder() + .layer( + " M ", // West + "S0s", //South INCUBATOR North + " " //East + ) + .layer( + " ", + " b ", + " " + ) + .block('b', BlockRegistry.PYROMANTIC_BRAZIER) + .block('0', BlockRegistry.INCUBATOR, BlockRegistry.INCUBATOR, "[north=true,east=false,south=true,west=true]") + .block('M', BlockRegistry.INCUBATOR_MERCURY_VESSEL) + .block('S', BlockRegistry.INCUBATOR_SALT_VESSEL) + .block('s', BlockRegistry.INCUBATOR_SULFUR_VESSEL) + .build() + ); + + this.add(this.modLoc("placement/sal_ammoniac_accumulator"), + new DenseMultiblockBuilder() + .layer("0") + .layer("b") + .block('b', BlockRegistry.SAL_AMMONIAC_TANK) + .block('0', BlockRegistry.SAL_AMMONIAC_ACCUMULATOR) + .build() + ); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/AccumulationRecipeProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/AccumulationRecipeProvider.java new file mode 100644 index 000000000..b54501037 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/AccumulationRecipeProvider.java @@ -0,0 +1,77 @@ +/* + * SPDX-FileCopyrightText: 2022 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.datagen.recipe; + +import com.google.gson.JsonObject; +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.content.recipe.AccumulationRecipe; +import com.klikli_dev.theurgy.registry.FluidRegistry; +import com.klikli_dev.theurgy.registry.ItemTagRegistry; +import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.FluidTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.material.Fluid; +import net.minecraftforge.fluids.FluidStack; +import org.jetbrains.annotations.Nullable; + +import java.util.function.BiConsumer; + +public class AccumulationRecipeProvider extends JsonRecipeProvider { + + public static final int TIME = AccumulationRecipe.DEFAULT_ACCUMULATION_TIME; + + public AccumulationRecipeProvider(PackOutput packOutput) { + super(packOutput, Theurgy.MODID, "accumulation"); + } + + @Override + void buildRecipes(BiConsumer recipeConsumer) { + var salAmmoniac = FluidRegistry.SAL_AMMONIAC.get(); + + this.makeRecipe("sal_ammoniac_from_water", salAmmoniac, 100, (Item) null, FluidTags.WATER, 1000, TIME); + this.makeRecipe("sal_ammoniac_from_water_and_sal_ammoniac_crystal", salAmmoniac, 1000, ItemTagRegistry.SAL_AMMONIAC_GEMS, FluidTags.WATER, 1000, TIME); + } + + public void makeRecipe(String name, Fluid result, int resultAmount, @Nullable Item solute, TagKey evaporant, int evaporantAmount, int accumulationTime) { + this.recipeConsumer.accept( + this.modLoc(name), + this.makeRecipeJson( + this.makeFluidTagIngredient(evaporant.location(), evaporantAmount), + solute != null ? this.makeItemIngredient(this.locFor(solute)) : null, + this.makeFluidResult(new FluidStack(result, resultAmount)), accumulationTime)); + } + + public void makeRecipe(String name, Fluid result, int resultAmount, @Nullable TagKey solute, TagKey evaporant, int evaporantAmount, int accumulationTime) { + this.recipeConsumer.accept( + this.modLoc(name), + this.makeRecipeJson( + this.makeFluidTagIngredient(evaporant.location(), evaporantAmount), + solute != null ? this.makeTagIngredient(solute.location()) : null, + this.makeFluidResult(new FluidStack(result, resultAmount)), accumulationTime)); + } + + public JsonObject makeRecipeJson(JsonObject evaporant, @Nullable JsonObject solute, JsonObject result, int accumulationTime) { + + var recipe = new JsonObject(); + recipe.addProperty("type", RecipeTypeRegistry.ACCUMULATION.getId().toString()); + recipe.add("evaporant", evaporant); + if (solute != null) + recipe.add("solute", solute); + recipe.add("result", result); + recipe.addProperty("accumulation_time", accumulationTime); + return recipe; + } + + + @Override + public String getName() { + return "Accumulation Recipes"; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/CalcinationRecipeProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/CalcinationRecipeProvider.java new file mode 100644 index 000000000..e1b151b45 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/CalcinationRecipeProvider.java @@ -0,0 +1,121 @@ +/* + * SPDX-FileCopyrightText: 2022 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.datagen.recipe; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.content.recipe.CalcinationRecipe; +import com.klikli_dev.theurgy.registry.ItemTagRegistry; +import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; +import com.klikli_dev.theurgy.registry.SaltRegistry; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraftforge.common.Tags; + +import java.util.function.BiConsumer; + +public class CalcinationRecipeProvider extends JsonRecipeProvider { + + public static final int TIME = CalcinationRecipe.DEFAULT_CALCINATION_TIME; + + public CalcinationRecipeProvider(PackOutput packOutput) { + super(packOutput, Theurgy.MODID, "calcination"); + } + + @Override + void buildRecipes(BiConsumer recipeConsumer) { + this.makeRecipe(SaltRegistry.STRATA.get(), "from_stone", Tags.Items.STONE); + this.makeRecipe(SaltRegistry.STRATA.get(), "from_sandstone", Tags.Items.SANDSTONE); + this.makeRecipe(SaltRegistry.STRATA.get(), "from_cobblestone", Tags.Items.COBBLESTONE); + this.makeRecipe(SaltRegistry.STRATA.get(), "from_dirt", ItemTags.DIRT); + this.makeRecipe(SaltRegistry.STRATA.get(), "from_sand", ItemTags.SAND); + this.makeRecipe(SaltRegistry.STRATA.get(), "from_gravel", 1, Items.GRAVEL, 1, TIME); + this.makeRecipe(SaltRegistry.STRATA.get(), "from_clay", 4, Items.CLAY, 1, TIME); + this.makeRecipe(SaltRegistry.STRATA.get(), "from_clay_ball", 1, Items.CLAY_BALL, 1, TIME); + this.makeRecipe(SaltRegistry.MINERAL.get(), "from_ores", Tags.Items.ORES); + this.makeRecipe(SaltRegistry.MINERAL.get(), "from_raw_materials", Tags.Items.RAW_MATERIALS); + this.makeRecipe(SaltRegistry.MINERAL.get(), "from_ingots", 2, Tags.Items.INGOTS); + this.makeRecipe(SaltRegistry.MINERAL.get(), "from_gems", 2, Tags.Items.GEMS); + this.makeRecipe(SaltRegistry.MINERAL.get(), "from_other_minerals", 2, ItemTagRegistry.OTHER_MINERALS); + this.makeRecipe(SaltRegistry.CROPS.get(), "", Tags.Items.CROPS); + this.makeRecipe(SaltRegistry.MINERAL.get(), "", 1, SaltRegistry.STRATA.get(), 20, TIME); + } + + + public void makeRecipe(Item salt, String suffix, TagKey ingredient) { + this.makeRecipe(salt, suffix, ingredient, TIME); + } + + public void makeRecipe(Item salt, String suffix, TagKey ingredient, int calcinationTime) { + this.makeRecipe(salt, suffix, 1, ingredient, 1, calcinationTime); + } + + public void makeRecipe(Item salt, String suffix, int resultCount, TagKey ingredient) { + this.makeRecipe(salt, suffix, resultCount, ingredient, 1); + } + + + public void makeRecipe(Item salt, String suffix, int resultCount, TagKey ingredient, int ingredientCount) { + this.makeRecipe(salt, suffix, resultCount, ingredient, ingredientCount, TIME); + } + + public void makeRecipe(Item salt, String suffix, int resultCount, Item ingredient, int ingredientCount, int calcinationTime) { + var name = this.name(salt).replace("alchemical_salt_", ""); + if (suffix != null && !suffix.isEmpty()) + name += "_" + suffix; + + var recipe = this.makeRecipeJson( + this.makeItemIngredient(this.locFor(ingredient)), ingredientCount, + this.makeItemResult(this.locFor(salt), resultCount), calcinationTime); + + this.recipeConsumer.accept( + this.modLoc(name), + recipe + ); + + } + + public void makeRecipe(Item salt, String suffix, int resultCount, TagKey ingredient, int ingredientCount, int calcinationTime) { + var name = this.name(salt).replace("alchemical_salt_", ""); + if (suffix != null && !suffix.isEmpty()) + name += "_" + suffix; + + var recipe = this.makeRecipeJson( + this.makeTagIngredient(this.locFor(ingredient)), ingredientCount, + this.makeItemResult(this.locFor(salt), resultCount), calcinationTime); + + var conditions = new JsonArray(); + conditions.add(this.makeTagNotEmptyCondition(ingredient.location().toString())); + recipe.add("conditions", conditions); + + this.recipeConsumer.accept( + this.modLoc(name), + recipe + ); + + } + + public JsonObject makeRecipeJson(JsonObject ingredient, int ingredientCount, JsonObject result, int calcinationTime) { + var recipe = new JsonObject(); + recipe.addProperty("type", RecipeTypeRegistry.CALCINATION.getId().toString()); + recipe.add("ingredient", ingredient); + recipe.addProperty("ingredient_count", ingredientCount); + recipe.add("result", result); + recipe.addProperty("calcination_time", calcinationTime); + return recipe; + } + + @Override + public String getName() { + return "Calcination Recipes"; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/DistillationRecipeProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/DistillationRecipeProvider.java new file mode 100644 index 000000000..12986df32 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/DistillationRecipeProvider.java @@ -0,0 +1,148 @@ +/* + * SPDX-FileCopyrightText: 2022 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.datagen.recipe; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.content.recipe.DistillationRecipe; +import com.klikli_dev.theurgy.registry.ItemRegistry; +import com.klikli_dev.theurgy.registry.ItemTagRegistry; +import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraftforge.common.Tags; +import net.minecraftforge.registries.ForgeRegistries; + +import java.util.function.BiConsumer; + +public class DistillationRecipeProvider extends JsonRecipeProvider { + + public static final int TIME = DistillationRecipe.DEFAULT_DISTILLATION_TIME; + + public DistillationRecipeProvider(PackOutput packOutput) { + super(packOutput, Theurgy.MODID, "distillation"); + } + + @Override + void buildRecipes(BiConsumer recipeConsumer) { + this.makeMercuryShardRecipe(1, Tags.Items.STONE, 10); + this.makeMercuryShardRecipe(1, Tags.Items.SANDSTONE, 10); + this.makeMercuryShardRecipe(1, ItemTags.STONE_BRICKS, 10); + this.makeMercuryShardRecipe(1, Tags.Items.COBBLESTONE, 10); + this.makeMercuryShardRecipe(1, Tags.Items.GRAVEL, 15); + this.makeMercuryShardRecipe(1, ItemTags.DIRT, 25); + this.makeMercuryShardRecipe(1, Tags.Items.SAND, 15); + this.makeMercuryShardRecipe(1, Tags.Items.GLASS, 10); + + this.makeMercuryShardRecipe(5, ItemTagRegistry.LOW_MERCURY_ORES, 1); + this.makeMercuryShardRecipe(25, ItemTagRegistry.MEDIUM_MERCURY_ORES, 1); + this.makeMercuryShardRecipe(50, ItemTagRegistry.HIGH_MERCURY_ORES, 1); + + this.makeMercuryShardRecipe(1, ItemTagRegistry.LOW_MERCURY_RAW_MATERIALS, 1); + this.makeMercuryShardRecipe(5, ItemTagRegistry.MEDIUM_MERCURY_RAW_MATERIALS, 1); + this.makeMercuryShardRecipe(10, ItemTagRegistry.HIGH_MERCURY_RAW_MATERIALS, 1); + + this.makeMercuryShardRecipe(1, ItemTagRegistry.LOW_MERCURY_METALS, 1); + this.makeMercuryShardRecipe(5, ItemTagRegistry.MEDIUM_MERCURY_METALS, 1); + this.makeMercuryShardRecipe(10, ItemTagRegistry.HIGH_MERCURY_METALS, 1); + + this.makeMercuryShardRecipe(1, ItemTagRegistry.LOW_MERCURY_GEMS, 1); + this.makeMercuryShardRecipe(5, ItemTagRegistry.MEDIUM_MERCURY_GEMS, 1); + this.makeMercuryShardRecipe(10, ItemTagRegistry.HIGH_MERCURY_GEMS, 1); + + this.makeMercuryShardRecipe(1, ItemTagRegistry.LOW_MERCURY_OTHER_MINERALS, 1); + this.makeMercuryShardRecipe(5, ItemTagRegistry.MEDIUM_MERCURY_OTHER_MINERALS, 1); + this.makeMercuryShardRecipe(10, ItemTagRegistry.HIGH_MERCURY_OTHER_MINERALS, 1); + + this.makeMercuryShardRecipe(1, Tags.Items.CROPS, 3); + this.makeMercuryShardRecipe(1, Tags.Items.DYES, 3); + this.makeMercuryShardRecipe(1, Items.PORKCHOP, 2); + this.makeMercuryShardRecipe(1, Items.COOKED_PORKCHOP, 1); + this.makeMercuryShardRecipe(1, Items.BEEF, 2); + this.makeMercuryShardRecipe(1, Items.COOKED_BEEF, 1); + this.makeMercuryShardRecipe(1, Items.CHICKEN, 2); + this.makeMercuryShardRecipe(1, Items.COOKED_CHICKEN, 1); + this.makeMercuryShardRecipe(1, Items.COD, 2); + this.makeMercuryShardRecipe(1, Items.COOKED_COD, 1); + this.makeMercuryShardRecipe(1, Items.SALMON, 2); + this.makeMercuryShardRecipe(1, Items.COOKED_SALMON, 1); + this.makeMercuryShardRecipe(1, Items.RABBIT, 2); + this.makeMercuryShardRecipe(1, Items.COOKED_RABBIT, 1); + this.makeMercuryShardRecipe(1, Items.BREAD, 1); + this.makeMercuryShardRecipe(1, ItemTags.FLOWERS, 3); + this.makeMercuryShardRecipe(1, ItemTags.SAPLINGS, 3); + this.makeMercuryShardRecipe(1, ItemTags.LEAVES, 5); + this.makeMercuryShardRecipe(1, ItemTags.LOGS, 2); + this.makeMercuryShardRecipe(1, ItemTags.PLANKS, 8); + this.makeMercuryShardRecipe(1, ItemTags.WOOL, 1); + + } + + public void makeMercuryShardRecipe(int resultCount, TagKey ingredient, int ingredientCount) { + this.makeMercuryShardRecipe(resultCount, ingredient, ingredientCount, TIME); + } + + public void makeMercuryShardRecipe(int resultCount, TagKey ingredient, int ingredientCount, int distillationTime) { + this.makeMercuryShardRecipe(ingredient.location().getPath().replace("/", "."), resultCount, ingredient, ingredientCount, distillationTime); + } + + public void makeMercuryShardRecipe(String recipeName, int resultCount, TagKey ingredient, int ingredientCount, int distillationTime) { + + var recipe = this.makeRecipeJson( + this.makeTagIngredient(ingredient.location()), + ingredientCount, + this.makeItemResult(this.locFor(ItemRegistry.MERCURY_SHARD.get()), resultCount), distillationTime); + + var conditions = new JsonArray(); + conditions.add(this.makeTagNotEmptyCondition(ingredient.location().toString())); + recipe.add("conditions", conditions); + + this.recipeConsumer.accept( + this.modLoc(recipeName), + recipe + ); + + } + + public void makeMercuryShardRecipe(int resultCount, Item ingredient, int ingredientCount) { + this.makeMercuryShardRecipe(resultCount, ingredient, ingredientCount, TIME); + } + + public void makeMercuryShardRecipe(int resultCount, Item ingredient, int ingredientCount, int distillationTime) { + this.makeMercuryShardRecipe(ForgeRegistries.ITEMS.getKey(ingredient).getPath(), resultCount, ingredient, ingredientCount, distillationTime); + } + + public void makeMercuryShardRecipe(String recipeName, int resultCount, Item ingredient, int ingredientCount, int distillationTime) { + this.recipeConsumer.accept( + this.modLoc(recipeName), + this.makeRecipeJson( + this.makeItemIngredient(this.locFor(ingredient)), + ingredientCount, + this.makeItemResult(this.locFor(ItemRegistry.MERCURY_SHARD.get()), resultCount), distillationTime)); + + } + + public JsonObject makeRecipeJson(JsonObject ingredient, int ingredientCount, JsonObject result, int distillationTime) { + var recipe = new JsonObject(); + recipe.addProperty("type", RecipeTypeRegistry.DISTILLATION.getId().toString()); + recipe.add("ingredient", ingredient); + recipe.addProperty("ingredient_count", ingredientCount); + recipe.add("result", result); + recipe.addProperty("distillation_time", distillationTime); + return recipe; + } + + @Override + public String getName() { + return "Distillation Recipes"; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/IncubationRecipeProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/IncubationRecipeProvider.java new file mode 100644 index 000000000..ee7625693 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/IncubationRecipeProvider.java @@ -0,0 +1,158 @@ +/* + * SPDX-FileCopyrightText: 2022 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.datagen.recipe; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.content.item.AlchemicalSaltItem; +import com.klikli_dev.theurgy.content.item.AlchemicalSulfurItem; +import com.klikli_dev.theurgy.content.recipe.IncubationRecipe; +import com.klikli_dev.theurgy.registry.ItemRegistry; +import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; +import com.klikli_dev.theurgy.registry.SaltRegistry; +import com.klikli_dev.theurgy.registry.SulfurRegistry; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraftforge.common.Tags; + +import java.util.function.BiConsumer; + +public class IncubationRecipeProvider extends JsonRecipeProvider { + + public static final int TIME = IncubationRecipe.DEFAULT_INCUBATION_TIME; + + public IncubationRecipeProvider(PackOutput packOutput) { + super(packOutput, Theurgy.MODID, "incubation"); + } + + @Override + void buildRecipes(BiConsumer recipeConsumer) { + this.makeRecipe(Items.WHEAT, ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.CROPS.get(), SulfurRegistry.WHEAT.get()); + + //metal ingots from sulfurs + this.makeRecipe(Tags.Items.INGOTS_IRON, ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.IRON.get()); + this.makeRecipe(Tags.Items.INGOTS_COPPER, ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.COPPER.get()); + this.makeRecipe(Tags.Items.INGOTS_GOLD, ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.GOLD.get()); + this.makeRecipe(Tags.Items.INGOTS_NETHERITE, ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.NETHERITE.get()); + this.makeRecipe(this.tag("forge:ingots/uranium"), ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.URANIUM.get()); + this.makeRecipe(this.tag("forge:ingots/silver"), ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.SILVER.get()); + this.makeRecipe(this.tag("forge:ingots/azure_silver"), ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.AZURE_SILVER.get()); + this.makeRecipe(this.tag("forge:ingots/zinc"), ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.ZINC.get()); + this.makeRecipe(this.tag("forge:ingots/osmium"), ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.OSMIUM.get()); + this.makeRecipe(this.tag("forge:ingots/nickel"), ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.NICKEL.get()); + this.makeRecipe(this.tag("forge:ingots/lead"), ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.LEAD.get()); + this.makeRecipe(this.tag("forge:ingots/allthemodium"), ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.ALLTHEMODIUM.get()); + this.makeRecipe(this.tag("forge:ingots/unobtainium"), ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.UNOBTAINIUM.get()); + this.makeRecipe(this.tag("forge:ingots/iridium"), ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.IRIDIUM.get()); + this.makeRecipe(this.tag("forge:ingots/tin"), ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.TIN.get()); + this.makeRecipe(this.tag("forge:ingots/cinnabar"), ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.CINNABAR.get()); + this.makeRecipe(this.tag("forge:ingots/crimson_iron"), ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.CRIMSON_IRON.get()); + this.makeRecipe(this.tag("forge:ingots/platinum"), ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.PLATINUM.get()); + this.makeRecipe(this.tag("forge:ingots/vibranium"), ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.VIBRANIUM.get()); + + //gems from sulfurs + this.makeRecipe(this.tag("forge:gems/diamond"), ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.DIAMOND.get()); + this.makeRecipe(this.tag("forge:gems/emerald"), ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.EMERALD.get()); + this.makeRecipe(this.tag("forge:gems/lapis"), ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.LAPIS.get()); + this.makeRecipe(this.tag("forge:gems/quartz"), ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.QUARTZ.get()); + this.makeRecipe(this.tag("forge:gems/amethyst"), ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.AMETHYST.get()); + this.makeRecipe(this.tag("forge:gems/prismarine"), ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.PRISMARINE.get()); + this.makeRecipe(this.tag("forge:gems/ruby"), ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.RUBY.get()); + this.makeRecipe(this.tag("forge:gems/apatite"), ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.APATITE.get()); + this.makeRecipe(this.tag("forge:gems/peridot"), ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.PERIDOT.get()); + this.makeRecipe(this.tag("forge:gems/fluorite"), ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.FLUORITE.get()); + this.makeRecipe(this.tag("forge:gems/sapphire"), ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.SAPPHIRE.get()); + this.makeRecipe(this.tag("forge:gems/sal_ammoniac"), ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.SAL_AMMONIAC.get()); + + //other common minerals from sulfur + this.makeRecipe(Tags.Items.DUSTS_REDSTONE, ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.REDSTONE.get()); + this.makeRecipe(ItemTags.COALS, ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.COAL.get()); + this.makeRecipe(this.tag("forge:gems/sulfur"), ItemRegistry.MERCURY_SHARD.get(), SaltRegistry.MINERAL.get(), SulfurRegistry.SULFUR.get()); + } + + public void makeRecipe(TagKey result, Item mercury, AlchemicalSaltItem salt, AlchemicalSulfurItem sulfur) { + this.makeRecipe(result, 1, mercury, salt, sulfur, TIME); + } + + public void makeRecipe(TagKey result, Item mercury, AlchemicalSaltItem salt, AlchemicalSulfurItem sulfur, int incubationTime) { + this.makeRecipe(result, 1, mercury, salt, sulfur, incubationTime); + } + + public void makeRecipe(TagKey result, int resultCount, Item mercury, AlchemicalSaltItem salt, AlchemicalSulfurItem sulfur, int incubationTime) { + this.makeRecipe(this.name(result) + "_from_" + this.name(sulfur), result, resultCount, mercury, salt, sulfur, incubationTime); + } + + public void makeRecipe(String recipeName, TagKey result, Item mercury, AlchemicalSaltItem salt, AlchemicalSulfurItem sulfur, int incubationTime) { + this.makeRecipe(recipeName, result, 1, mercury, salt, sulfur, incubationTime); + } + + public void makeRecipe(String recipeName, TagKey result, int resultCount, Item mercury, AlchemicalSaltItem salt, AlchemicalSulfurItem sulfur, int incubationTime) { + + var recipe = this.makeRecipeJson( + this.makeItemIngredient(this.locFor(mercury)), + this.makeItemIngredient(this.locFor(salt)), + this.makeItemIngredient(this.locFor(sulfur)), + this.makeTagResult(this.locFor(result), resultCount), incubationTime); + + var conditions = new JsonArray(); + conditions.add(this.makeTagNotEmptyCondition(result.location().toString())); + recipe.add("conditions", conditions); + + this.recipeConsumer.accept( + this.modLoc(recipeName), + recipe + ); + } + + public void makeRecipe(Item result, Item mercury, AlchemicalSaltItem salt, AlchemicalSulfurItem sulfur) { + this.makeRecipe(result, 1, mercury, salt, sulfur, TIME); + } + + public void makeRecipe(Item result, Item mercury, AlchemicalSaltItem salt, AlchemicalSulfurItem sulfur, int incubationTime) { + this.makeRecipe(result, 1, mercury, salt, sulfur, incubationTime); + } + + public void makeRecipe(Item result, int resultCount, Item mercury, AlchemicalSaltItem salt, AlchemicalSulfurItem sulfur, int incubationTime) { + this.makeRecipe(this.name(result), result, resultCount, mercury, salt, sulfur, incubationTime); + } + + public void makeRecipe(String recipeName, Item result, Item mercury, AlchemicalSaltItem salt, AlchemicalSulfurItem sulfur, int incubationTime) { + this.makeRecipe(recipeName, result, 1, mercury, salt, sulfur, incubationTime); + } + + public void makeRecipe(String recipeName, Item result, int resultCount, Item mercury, AlchemicalSaltItem salt, AlchemicalSulfurItem sulfur, int incubationTime) { + this.recipeConsumer.accept( + this.modLoc(recipeName), + this.makeRecipeJson( + this.makeItemIngredient(this.locFor(mercury)), + this.makeItemIngredient(this.locFor(salt)), + this.makeItemIngredient(this.locFor(sulfur)), + this.makeItemResult(this.locFor(result), resultCount), incubationTime)); + + } + + public JsonObject makeRecipeJson(JsonObject mercury, JsonObject salt, JsonObject sulfur, JsonObject result, int incubationTime) { + var recipe = new JsonObject(); + recipe.addProperty("type", RecipeTypeRegistry.INCUBATION.getId().toString()); + recipe.add("mercury", mercury); + recipe.add("salt", salt); + recipe.add("sulfur", sulfur); + recipe.add("result", result); + recipe.addProperty("incubation_time", incubationTime); + return recipe; + } + + @Override + public String getName() { + return "Incubation Recipes"; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/JsonRecipeProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/JsonRecipeProvider.java new file mode 100644 index 000000000..b79a3ef11 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/JsonRecipeProvider.java @@ -0,0 +1,197 @@ +/* + * SPDX-FileCopyrightText: 2022 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.datagen.recipe; + +import com.google.common.collect.Sets; +import com.google.gson.JsonObject; +import com.mojang.serialization.JsonOps; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.CachedOutput; +import net.minecraft.data.DataProvider; +import net.minecraft.data.PackOutput; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtOps; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.material.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.concurrent.CompletableFuture; +import java.util.function.BiConsumer; + +public abstract class JsonRecipeProvider implements DataProvider { + + protected final PackOutput.PathProvider recipePathProvider; + protected String modid; + + protected BiConsumer recipeConsumer; + + public JsonRecipeProvider(PackOutput packOutput, String modid) { + this(packOutput, modid, ""); + } + + /** + * Creates a new recipe provider with the given sub path. + * + * @param packOutput + * @param recipeSubPath e.g. "calcination" + */ + public JsonRecipeProvider(PackOutput packOutput, String modid, String recipeSubPath) { + this.recipePathProvider = packOutput.createPathProvider(PackOutput.Target.DATA_PACK, "recipes/" + recipeSubPath); + this.modid = modid; + } + + protected String name(Item item) { + return ForgeRegistries.ITEMS.getKey(item).getPath(); + } + + protected String name(TagKey tag) { + return tag.location().getPath().replace('/', '_'); + } + + public ResourceLocation locFor(TagKey tag) { + return tag.location(); + } + + public ResourceLocation locFor(ItemLike itemLike) { + return ForgeRegistries.ITEMS.getKey(itemLike.asItem()); + } + + public ResourceLocation locFor(Fluid fluid) { + return ForgeRegistries.FLUIDS.getKey(fluid); + } + + public TagKey tag(String tag) { + return this.tag(new ResourceLocation(tag)); + } + + public TagKey tag(ResourceLocation tag) { + return TagKey.create(Registries.ITEM, tag); + } + + public ResourceLocation modLoc(String name) { + return new ResourceLocation(this.modid, name); + } + + public ResourceLocation mcLoc(String name) { + return new ResourceLocation(name); + } + + public ResourceLocation forgeLoc(String name) { + return new ResourceLocation("forge", name); + } + + public JsonObject makeFluidIngredient(ResourceLocation fluid, int amount) { + JsonObject jsonobject = new JsonObject(); + jsonobject.addProperty("fluid", fluid.toString()); + jsonobject.addProperty("amount", amount); + return jsonobject; + } + + public JsonObject makeFluidTagIngredient(ResourceLocation tag, int amount) { + JsonObject jsonobject = new JsonObject(); + jsonobject.addProperty("tag", tag.toString()); + jsonobject.addProperty("amount", amount); + return jsonobject; + } + + public JsonObject makeTagIngredient(ResourceLocation tag) { + JsonObject jsonobject = new JsonObject(); + jsonobject.addProperty("tag", tag.toString()); + return jsonobject; + } + + public JsonObject makeItemIngredient(ResourceLocation item) { + JsonObject jsonobject = new JsonObject(); + jsonobject.addProperty("item", item.toString()); + return jsonobject; + } + + public JsonObject makeItemResult(ResourceLocation item) { + return this.makeItemResult(item, 1); + } + + public JsonObject makeItemResult(ResourceLocation item, int count) { + return this.makeItemResult(item, count, (JsonObject) null); + } + + public JsonObject makeItemResult(ResourceLocation item, int count, @Nullable CompoundTag nbt) { + return this.makeItemResult(item, count, nbt == null ? null : (JsonObject) NbtOps.INSTANCE.convertTo(JsonOps.INSTANCE, nbt)); + } + + public JsonObject makeItemResult(ResourceLocation item, int count, @Nullable JsonObject nbt) { + JsonObject jsonobject = new JsonObject(); + jsonobject.addProperty("item", item.toString()); + jsonobject.addProperty("count", count); + if (nbt != null) { + jsonobject.add("nbt", nbt); + } + return jsonobject; + } + + public JsonObject makeTagResult(ResourceLocation item) { + return this.makeTagResult(item, 1); + } + + public JsonObject makeTagResult(ResourceLocation item, int count) { + return this.makeTagResult(item, count, (JsonObject) null); + } + + public JsonObject makeTagResult(ResourceLocation tag, int count, @Nullable CompoundTag nbt) { + return this.makeTagResult(tag, count, nbt == null ? null : (JsonObject) NbtOps.INSTANCE.convertTo(JsonOps.INSTANCE, nbt)); + } + + public JsonObject makeTagResult(ResourceLocation tag, int count, @Nullable JsonObject nbt) { + JsonObject jsonobject = new JsonObject(); + jsonobject.addProperty("tag", tag.toString()); + jsonobject.addProperty("count", count); + if (nbt != null) { + jsonobject.add("nbt", nbt); + } + return jsonobject; + } + + public JsonObject makeFluidResult(FluidStack fluidStack) { + return FluidStack.CODEC.encodeStart(JsonOps.INSTANCE, fluidStack).getOrThrow(false, (s -> { + throw new IllegalStateException("Failed to encode fluid stack: " + s); + })).getAsJsonObject(); + } + + public JsonObject makeTagNotEmptyCondition(String tag) { + var condition = new JsonObject(); + condition.addProperty("type", "forge:not"); + var value = new JsonObject(); + value.addProperty("type", "forge:tag_empty"); + value.addProperty("tag", tag); + condition.add("value", value); + return condition; + } + + @Override + public CompletableFuture run(CachedOutput pOutput) { + Set set = Sets.newHashSet(); + List> futures = new ArrayList<>(); + this.recipeConsumer = (id, recipe) -> { + if (!set.add(id)) { + throw new IllegalStateException("Duplicate recipe " + id); + } else { + futures.add(DataProvider.saveStable(pOutput, recipe, this.recipePathProvider.json(id))); + } + }; + this.buildRecipes(this.recipeConsumer); + return CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new)); + } + + abstract void buildRecipes(BiConsumer recipeConsumer); +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/LiquefactionRecipeProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/LiquefactionRecipeProvider.java new file mode 100644 index 000000000..59dbf6e9d --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/LiquefactionRecipeProvider.java @@ -0,0 +1,231 @@ +/* + * SPDX-FileCopyrightText: 2022 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.datagen.recipe; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.TheurgyConstants; +import com.klikli_dev.theurgy.content.recipe.LiquefactionRecipe; +import com.klikli_dev.theurgy.registry.FluidRegistry; +import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; +import com.klikli_dev.theurgy.registry.SulfurRegistry; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.material.Fluid; +import net.minecraftforge.common.Tags; + +import java.util.function.BiConsumer; + +public class LiquefactionRecipeProvider extends JsonRecipeProvider { + + public static final int TIME = LiquefactionRecipe.DEFAULT_LIQUEFACTION_TIME; + + public LiquefactionRecipeProvider(PackOutput packOutput) { + super(packOutput, Theurgy.MODID, "liquefaction"); + } + + @Override + void buildRecipes(BiConsumer recipeConsumer) { + var salAmmoniac = FluidRegistry.SAL_AMMONIAC.get(); + + + //Vanilla + //Sulfurs with overrideTagSourceName + this.makeRecipe(SulfurRegistry.LOGS.get(), ItemTags.LOGS, salAmmoniac, 10); + + //Crops + this.makeRecipe(SulfurRegistry.WHEAT.get(), Items.WHEAT, salAmmoniac, 10); + + //Common Metals Ore Sulfurs + this.makeRecipe(SulfurRegistry.IRON.get(), 3, Tags.Items.ORES_IRON, salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.COPPER.get(), 3, Tags.Items.ORES_COPPER, salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.GOLD.get(), 3, Tags.Items.ORES_GOLD, salAmmoniac, 15); + this.makeRecipe(SulfurRegistry.NETHERITE.get(), 3, Tags.Items.ORES_NETHERITE_SCRAP, salAmmoniac, 100); + this.makeRecipe(SulfurRegistry.URANIUM.get(), 3, this.tag("forge:ores/uranium"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.SILVER.get(), 3, this.tag("forge:ores/silver"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.AZURE_SILVER.get(), 3, this.tag("forge:ores/azure_silver"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.ZINC.get(), 3, this.tag("forge:ores/zinc"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.OSMIUM.get(), 3, this.tag("forge:ores/osmium"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.NICKEL.get(), 3, this.tag("forge:ores/nickel"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.LEAD.get(), 3, this.tag("forge:ores/lead"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.ALLTHEMODIUM.get(), 3, this.tag("forge:ores/allthemodium"), salAmmoniac, 100); + this.makeRecipe(SulfurRegistry.UNOBTAINIUM.get(), 3, this.tag("forge:ores/unobtainium"), salAmmoniac, 100); + this.makeRecipe(SulfurRegistry.IRIDIUM.get(), 3, this.tag("forge:ores/iridium"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.TIN.get(), 3, this.tag("forge:ores/tin"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.CINNABAR.get(), 3, this.tag("forge:ores/cinnabar"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.CRIMSON_IRON.get(), 3, this.tag("forge:ores/crimson_iron"), salAmmoniac, 20); + this.makeRecipe(SulfurRegistry.PLATINUM.get(), 3, this.tag("forge:ores/platinum"), salAmmoniac, 20); + this.makeRecipe(SulfurRegistry.VIBRANIUM.get(), 3, this.tag("forge:ores/vibranium"), salAmmoniac, 20); + + //Common Gems Ore Sulfurs + this.makeRecipe(SulfurRegistry.DIAMOND.get(), 4, Tags.Items.ORES_DIAMOND, salAmmoniac, 100); + this.makeRecipe(SulfurRegistry.EMERALD.get(), 4, Tags.Items.ORES_EMERALD, salAmmoniac, 100); + this.makeRecipe(SulfurRegistry.LAPIS.get(), 10, Tags.Items.ORES_LAPIS, salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.QUARTZ.get(), 8, Tags.Items.ORES_QUARTZ, salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.RUBY.get(), 6, this.tag("forge:ores/ruby"), salAmmoniac, 15); + this.makeRecipe(SulfurRegistry.APATITE.get(), 8, this.tag("forge:ores/apatite"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.PERIDOT.get(), 6, this.tag("forge:ores/peridot"), salAmmoniac, 15); + this.makeRecipe(SulfurRegistry.FLUORITE.get(), 6, this.tag("forge:ores/fluorite"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.SAPPHIRE.get(), 6, this.tag("forge:ores/sapphire"), salAmmoniac, 15); + this.makeRecipe(SulfurRegistry.SAL_AMMONIAC.get(), 4, this.tag("forge:ores/sal_ammoniac"), salAmmoniac, 15); + + //Other Common Mineral Ores + this.makeRecipe(SulfurRegistry.REDSTONE.get(), 9, Tags.Items.ORES_REDSTONE, salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.COAL.get(), 4, Tags.Items.ORES_COAL, salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.SULFUR.get(), 6, this.tag("forge:ores/sulfur"), salAmmoniac, 10); + + //Common Raw Materials Sulfurs + this.makeRecipe(SulfurRegistry.IRON.get(), 2, Tags.Items.RAW_MATERIALS_IRON, salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.COPPER.get(), 2, Tags.Items.RAW_MATERIALS_COPPER, salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.GOLD.get(), 2, Tags.Items.RAW_MATERIALS_GOLD, salAmmoniac, 15); + this.makeRecipe(SulfurRegistry.URANIUM.get(), 2, this.tag("forge:raw_materials/uranium"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.AZURE_SILVER.get(), 2, this.tag("forge:raw_materials/azure_silver"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.SILVER.get(), 2, this.tag("forge:raw_materials/silver"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.ZINC.get(), 2, this.tag("forge:raw_materials/zinc"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.OSMIUM.get(), 2, this.tag("forge:raw_materials/osmium"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.NICKEL.get(), 2, this.tag("forge:raw_materials/nickel"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.LEAD.get(), 2, this.tag("forge:raw_materials/lead"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.ALLTHEMODIUM.get(), 2, this.tag("forge:raw_materials/allthemodium"), salAmmoniac, 100); + this.makeRecipe(SulfurRegistry.UNOBTAINIUM.get(), 2, this.tag("forge:raw_materials/unobtainium"), salAmmoniac, 100); + this.makeRecipe(SulfurRegistry.IRIDIUM.get(), 2, this.tag("forge:raw_materials/iridium"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.TIN.get(), 2, this.tag("forge:raw_materials/tin"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.CINNABAR.get(), 2, this.tag("forge:raw_materials/cinnabar"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.CRIMSON_IRON.get(), 2, this.tag("forge:raw_materials/crimson_iron"), salAmmoniac, 20); + this.makeRecipe(SulfurRegistry.PLATINUM.get(), 2, this.tag("forge:raw_materials/platinum"), salAmmoniac, 20); + this.makeRecipe(SulfurRegistry.VIBRANIUM.get(), 2, this.tag("forge:raw_materials/vibranium"), salAmmoniac, 20); + + //Common Metal Ingots sulfurs + this.makeRecipe(SulfurRegistry.IRON.get(), 1, Tags.Items.INGOTS_IRON, salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.COPPER.get(), 1, Tags.Items.INGOTS_COPPER, salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.GOLD.get(), 1, Tags.Items.INGOTS_GOLD, salAmmoniac, 15); + this.makeRecipe(SulfurRegistry.NETHERITE.get(), 1, Tags.Items.INGOTS_NETHERITE, salAmmoniac, 100); + this.makeRecipe(SulfurRegistry.URANIUM.get(), 1, this.tag("forge:ingots/uranium"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.SILVER.get(), 1, this.tag("forge:ingots/silver"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.AZURE_SILVER.get(), 1, this.tag("forge:ingots/azure_silver"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.ZINC.get(), 1, this.tag("forge:ingots/zinc"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.OSMIUM.get(), 1, this.tag("forge:ingots/osmium"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.NICKEL.get(), 1, this.tag("forge:ingots/nickel"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.LEAD.get(), 1, this.tag("forge:ingots/lead"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.ALLTHEMODIUM.get(), 1, this.tag("forge:ingots/allthemodium"), salAmmoniac, 100); + this.makeRecipe(SulfurRegistry.UNOBTAINIUM.get(), 1, this.tag("forge:ingots/unobtainium"), salAmmoniac, 100); + this.makeRecipe(SulfurRegistry.IRIDIUM.get(), 1, this.tag("forge:ingots/iridium"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.TIN.get(), 1, this.tag("forge:ingots/tin"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.CINNABAR.get(), 1, this.tag("forge:ingots/cinnabar"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.CRIMSON_IRON.get(), 1, this.tag("forge:ingots/crimson_iron"), salAmmoniac, 20); + this.makeRecipe(SulfurRegistry.PLATINUM.get(), 1, this.tag("forge:ingots/platinum"), salAmmoniac, 20); + this.makeRecipe(SulfurRegistry.VIBRANIUM.get(), 1, this.tag("forge:ingots/vibranium"), salAmmoniac, 20); + + //Common Gems Sulfurs + this.makeRecipe(SulfurRegistry.DIAMOND.get(), 1, Tags.Items.GEMS_DIAMOND, salAmmoniac, 100); + this.makeRecipe(SulfurRegistry.EMERALD.get(), 1, Tags.Items.GEMS_EMERALD, salAmmoniac, 100); + this.makeRecipe(SulfurRegistry.LAPIS.get(), 1, Tags.Items.GEMS_LAPIS, salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.QUARTZ.get(), 1, Tags.Items.GEMS_QUARTZ, salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.AMETHYST.get(), 1, Tags.Items.GEMS_AMETHYST, salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.PRISMARINE.get(), 1, Tags.Items.GEMS_PRISMARINE, salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.RUBY.get(), 1, this.tag("forge:gems/ruby"), salAmmoniac, 15); + this.makeRecipe(SulfurRegistry.APATITE.get(), 1, this.tag("forge:gems/apatite"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.PERIDOT.get(), 1, this.tag("forge:gems/peridot"), salAmmoniac, 15); + this.makeRecipe(SulfurRegistry.FLUORITE.get(), 1, this.tag("forge:gems/fluorite"), salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.SAPPHIRE.get(), 1, this.tag("forge:gems/sapphire"), salAmmoniac, 15); + this.makeRecipe(SulfurRegistry.SAL_AMMONIAC.get(), 1, this.tag("forge:gems/sal_ammoniac"), salAmmoniac, 15); + + //Other Common Minerals Sulfurs + this.makeRecipe(SulfurRegistry.REDSTONE.get(), 1, Tags.Items.DUSTS_REDSTONE, salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.COAL.get(), 1, ItemTags.COALS, salAmmoniac, 10); + this.makeRecipe(SulfurRegistry.SULFUR.get(), 1, this.tag("forge:gems/sulfur"), salAmmoniac, 10); + } + + + public void makeRecipe(Item sulfurName, Item ingredient, Fluid solvent, int solventAmount) { + this.makeRecipe(sulfurName, 1, ingredient, solvent, solventAmount, TIME); + } + + public void makeRecipe(Item sulfur, Item ingredient, Fluid solvent, int solventAmount, int liquefactionTime) { + this.makeRecipe(sulfur, 1, ingredient, solvent, solventAmount, liquefactionTime); + } + + public void makeRecipe(Item sulfur, int resultCount, Item ingredient, Fluid solvent, int solventAmount) { + this.makeRecipe(sulfur, resultCount, ingredient, solvent, solventAmount, TIME); + } + + public void makeRecipe(Item sulfur, int resultCount, Item ingredient, Fluid solvent, int solventAmount, int liquefactionTime) { + + var nbt = this.makeSulfurNbt(ingredient); + this.recipeConsumer.accept( + this.modLoc(this.name(sulfur)), + this.makeRecipeJson( + this.makeItemIngredient(this.locFor(ingredient)), + this.makeFluidIngredient(this.locFor(solvent), solventAmount), + this.makeItemResult(this.locFor(sulfur), resultCount, nbt), liquefactionTime)); + + } + + public void makeRecipe(Item sulfurName, TagKey ingredient, Fluid solvent, int solventAmount) { + this.makeRecipe(sulfurName, 1, ingredient, solvent, solventAmount, LiquefactionRecipe.DEFAULT_LIQUEFACTION_TIME); + } + + public void makeRecipe(Item sulfurName, TagKey ingredient, Fluid solvent, int solventAmount, int liquefactionTime) { + this.makeRecipe(sulfurName, 1, ingredient, solvent, solventAmount, liquefactionTime); + } + + public void makeRecipe(Item sulfur, int resultCount, TagKey ingredient, Fluid solvent, int solventAmount) { + this.makeRecipe(sulfur, resultCount, ingredient, solvent, solventAmount, LiquefactionRecipe.DEFAULT_LIQUEFACTION_TIME); + } + + public void makeRecipe(Item sulfur, int resultCount, TagKey ingredient, Fluid solvent, int solventAmount, int liquefactionTime) { + + var name = this.name(sulfur) + "_from_" + this.name(ingredient); + var nbt = this.makeSulfurNbt(ingredient); + var recipe = this.makeRecipeJson( + this.makeTagIngredient(ingredient.location()), + this.makeFluidIngredient(this.locFor(solvent), solventAmount), + this.makeItemResult(this.locFor(sulfur), resultCount, nbt), liquefactionTime); + + var conditions = new JsonArray(); + conditions.add(this.makeTagNotEmptyCondition(ingredient.location().toString())); + recipe.add("conditions", conditions); + + this.recipeConsumer.accept( + this.modLoc(name), + recipe + ); + + } + + + public JsonObject makeSulfurNbt(Item ingredient) { + var nbt = new JsonObject(); + nbt.addProperty(TheurgyConstants.Nbt.SULFUR_SOURCE_ID, this.locFor(ingredient).toString()); + return nbt; + } + + public JsonObject makeSulfurNbt(TagKey ingredient) { + var nbt = new JsonObject(); + nbt.addProperty(TheurgyConstants.Nbt.SULFUR_SOURCE_ID, "#" + ingredient.location()); + return nbt; + } + + public JsonObject makeRecipeJson(JsonObject ingredient, JsonObject solvent, JsonObject result, int liquefactionTime) { + var recipe = new JsonObject(); + recipe.addProperty("type", RecipeTypeRegistry.LIQUEFACTION.getId().toString()); + recipe.add("solvent", solvent); + recipe.add("ingredient", ingredient); + recipe.add("result", result); + recipe.addProperty("liquefaction_time", liquefactionTime); + return recipe; + } + + @Override + public String getName() { + return "Liquefaction Recipes"; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/ShapedRecipeProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/ShapedRecipeProvider.java new file mode 100644 index 000000000..0d12d29e8 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/ShapedRecipeProvider.java @@ -0,0 +1,324 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.datagen.recipe; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.TheurgyConstants; +import com.klikli_dev.theurgy.content.item.DivinationRodItem; +import com.klikli_dev.theurgy.registry.ItemRegistry; +import com.klikli_dev.theurgy.registry.ItemTagRegistry; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.ItemTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.Tier; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.common.Tags; +import net.minecraftforge.common.TierSortingRegistry; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.Nullable; + +import java.util.function.BiConsumer; + +public class ShapedRecipeProvider extends JsonRecipeProvider { + + public ShapedRecipeProvider(PackOutput packOutput) { + super(packOutput, Theurgy.MODID, "crafting/shaped"); + } + + @Override + void buildRecipes(BiConsumer recipeConsumer) { + //Divination Rods + this.makeRecipe("divination_rod_t1", new RecipeBuilder( + ItemRegistry.DIVINATION_ROD_T1.get(), 1, this.makeDivinationRodSettings(ItemRegistry.DIVINATION_ROD_T1.get())) + .pattern(" GR") + .pattern(" RG") + .pattern("R ") + .define('G', Tags.Items.GLASS) + .define('R', Tags.Items.RODS_WOODEN) + ); + + var amethystDivinationRodSettings = this.makeDivinationRodSettings(ItemRegistry.AMETHYST_DIVINATION_ROD.get()); + amethystDivinationRodSettings.addProperty(TheurgyConstants.Nbt.Divination.LINKED_BLOCK_ID, "minecraft:budding_amethyst"); + this.makeRecipe("amethyst_divination_rod", new RecipeBuilder( + ItemRegistry.AMETHYST_DIVINATION_ROD.get(), 1, amethystDivinationRodSettings) + .pattern(" GP") + .pattern(" RG") + .pattern("R ") + .define('P', Tags.Items.DYES_PURPLE) + .define('G', Tags.Items.GLASS) + .define('R', Tags.Items.RODS_WOODEN) + ); + + this.makeRecipe("sulfur_attuned_divination_rod_abundant", new RecipeBuilder( + ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_ABUNDANT.get(), 1, this.makeDivinationRodSettings(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_ABUNDANT.get()), "theurgy:divination_rod") + .pattern(" GS") + .pattern(" RG") + .pattern("R ") + .define('G', Tags.Items.GLASS) + .define('R', Tags.Items.RODS_WOODEN) + .define('S', ItemTagRegistry.ALCHEMICAL_SULFURS_ABUNDANT) + ); + this.makeRecipe("sulfur_attuned_divination_rod_common", new RecipeBuilder( + ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_COMMON.get(), 1, this.makeDivinationRodSettings(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_COMMON.get()), "theurgy:divination_rod") + .pattern(" GS") + .pattern(" RG") + .pattern("R ") + .define('G', Tags.Items.GLASS) + .define('R', Tags.Items.RODS_WOODEN) + .define('S', ItemTagRegistry.ALCHEMICAL_SULFURS_COMMON) + ); + + this.makeRecipe("divination_rod_t2", new RecipeBuilder( + ItemRegistry.DIVINATION_ROD_T2.get(), 1, this.makeDivinationRodSettings(ItemRegistry.DIVINATION_ROD_T2.get())) + .pattern(" GM") + .pattern(" AG") + .pattern("R ") + .define('G', Tags.Items.GLASS) + .define('R', Tags.Items.RODS_WOODEN) + .define('A', Tags.Items.GEMS_AMETHYST) + .define('M', Tags.Items.NUGGETS_GOLD) + ); + this.makeRecipe("sulfur_attuned_divination_rod_rare", new RecipeBuilder( + ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_RARE.get(), 1, this.makeDivinationRodSettings(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_RARE.get())) + .pattern(" GS") + .pattern(" AG") + .pattern("R ") + .define('G', Tags.Items.GLASS) + .define('R', Tags.Items.RODS_WOODEN) + .define('A', Tags.Items.GEMS_AMETHYST) + .define('S', ItemTagRegistry.ALCHEMICAL_SULFURS_RARE) + ); + + this.makeRecipe("divination_rod_t3", new RecipeBuilder( + ItemRegistry.DIVINATION_ROD_T3.get(), 1, this.makeDivinationRodSettings(ItemRegistry.DIVINATION_ROD_T3.get())) + .pattern(" GD") + .pattern(" QG") + .pattern("A ") + .define('G', Tags.Items.GLASS) + .define('Q', Tags.Items.GEMS_QUARTZ) + .define('D', Tags.Items.GEMS_DIAMOND) + .define('A', Tags.Items.GEMS_AMETHYST) + ); + this.makeRecipe("sulfur_attuned_divination_rod_precious", new RecipeBuilder( + ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_PRECIOUS.get(), 1, this.makeDivinationRodSettings(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_PRECIOUS.get())) + .pattern(" GS") + .pattern(" DG") + .pattern("A ") + .define('G', Tags.Items.GLASS) + .define('D', Tags.Items.GEMS_DIAMOND) + .define('A', Tags.Items.GEMS_AMETHYST) + .define('S', ItemTagRegistry.ALCHEMICAL_SULFURS_PRECIOUS) + ); + + this.makeRecipe("divination_rod_t4", new RecipeBuilder( + ItemRegistry.DIVINATION_ROD_T4.get(), 1, this.makeDivinationRodSettings(ItemRegistry.DIVINATION_ROD_T4.get())) + .pattern(" GM") + .pattern(" RG") + .pattern("A ") + .define('G', Tags.Items.GLASS) + .define('R', Tags.Items.RODS_BLAZE) + .define('M', Tags.Items.ORES_NETHERITE_SCRAP) + .define('A', Tags.Items.GEMS_AMETHYST) + ); + + this.makeRecipe(ItemRegistry.PYROMANTIC_BRAZIER.get(), new RecipeBuilder( + ItemRegistry.PYROMANTIC_BRAZIER.get(), 1) + .pattern("CCC") + .pattern("CSC") + .pattern("SSS") + .define('C', Tags.Items.INGOTS_COPPER) + .define('S', Tags.Items.STONE) + ); + + + this.makeRecipe(ItemRegistry.CALCINATION_OVEN.get(), new RecipeBuilder( + ItemRegistry.CALCINATION_OVEN.get(), 1) + .pattern(" I ") + .pattern("ICI") + .pattern(" I ") + .define('C', Tags.Items.STORAGE_BLOCKS_COPPER) + .define('I', Tags.Items.INGOTS_IRON) + ); + + + this.makeRecipe(ItemRegistry.DISTILLER.get(), new RecipeBuilder( + ItemRegistry.DISTILLER.get(), 1) + .pattern(" I ") + .pattern("ICI") + .pattern("III") + .define('C', Tags.Items.STORAGE_BLOCKS_COPPER) + .define('I', Tags.Items.INGOTS_IRON) + ); + + this.makeRecipe(ItemRegistry.LIQUEFACTION_CAULDRON.get(), new RecipeBuilder( + ItemRegistry.LIQUEFACTION_CAULDRON.get(), 1) + .pattern("CCC") + .pattern("IBI") + .pattern("SSS") + .define('C', Tags.Items.INGOTS_COPPER) + .define('I', Tags.Items.INGOTS_IRON) + .define('B', Items.CAULDRON) + .define('S', Tags.Items.STONE) + ); + + this.makeRecipe(ItemRegistry.SAL_AMMONIAC_ACCUMULATOR.get(), new RecipeBuilder( + ItemRegistry.SAL_AMMONIAC_ACCUMULATOR.get(), 1) + .pattern("ICI") + .pattern("SIS") + .pattern("S S") + .define('C', Tags.Items.STORAGE_BLOCKS_COPPER) + .define('I', Tags.Items.INGOTS_IRON) + .define('S', Tags.Items.STONE) + ); + + this.makeRecipe(ItemRegistry.SAL_AMMONIAC_TANK.get(), new RecipeBuilder( + ItemRegistry.SAL_AMMONIAC_TANK.get(), 1) + .pattern("ICI") + .pattern("ICI") + .pattern("RCR") + .define('R', Tags.Items.RODS_WOODEN) + .define('C', Tags.Items.INGOTS_COPPER) + .define('I', Tags.Items.INGOTS_IRON) + ); + + this.makeRecipe(ItemRegistry.INCUBATOR.get(), new RecipeBuilder( + ItemRegistry.INCUBATOR.get(), 1) + .pattern("PSP") + .pattern("GGG") + .pattern("SCS") + .define('P', ItemTags.PLANKS) + .define('C', Tags.Items.INGOTS_COPPER) + .define('G', Tags.Items.INGOTS_GOLD) + .define('S', Tags.Items.STONE) + ); + + this.makeRecipe(ItemRegistry.INCUBATOR_MERCURY_VESSEL.get(), new RecipeBuilder( + ItemRegistry.INCUBATOR_MERCURY_VESSEL.get(), 1) + .pattern("IMI") + .pattern("GCG") + .pattern("III") + .define('C', Tags.Items.STORAGE_BLOCKS_COPPER) + .define('I', Tags.Items.INGOTS_IRON) + .define('G', Tags.Items.INGOTS_GOLD) + .define('M', ItemTagRegistry.ALCHEMICAL_MERCURIES) + ); + + this.makeRecipe(ItemRegistry.INCUBATOR_SALT_VESSEL.get(), new RecipeBuilder( + ItemRegistry.INCUBATOR_SALT_VESSEL.get(), 1) + .pattern("ISI") + .pattern("cCc") + .pattern("III") + .define('C', Tags.Items.STORAGE_BLOCKS_COPPER) + .define('I', Tags.Items.INGOTS_IRON) + .define('c', Tags.Items.INGOTS_COPPER) + .define('S', ItemTagRegistry.ALCHEMICAL_SALTS) + ); + + this.makeRecipe(ItemRegistry.INCUBATOR_SULFUR_VESSEL.get(), new RecipeBuilder( + ItemRegistry.INCUBATOR_SULFUR_VESSEL.get(), 1) + .pattern("ISI") + .pattern("ICI") + .pattern("III") + .define('C', Tags.Items.STORAGE_BLOCKS_COPPER) + .define('I', Tags.Items.INGOTS_IRON) + .define('S', ItemTagRegistry.ALCHEMICAL_SULFURS) + ); + } + + public JsonObject makeDivinationRodSettings(DivinationRodItem rodItem) { + return this.makeDivinationRodSettings(rodItem.defaultTier, rodItem.defaultAllowedBlocksTag, rodItem.defaultDisallowedBlocksTag, rodItem.defaultRange, rodItem.defaultDuration, rodItem.defaultDurability); + } + + public JsonObject makeDivinationRodSettings(Tier defaultTier, TagKey defaultAllowedBlocksTag, TagKey defaultDisallowedBlocksTag, int defaultRange, int defaultDuration, int defaultDurability) { + JsonObject settings = new JsonObject(); + + settings.addProperty(TheurgyConstants.Nbt.Divination.SETTING_TIER, TierSortingRegistry.getName(defaultTier).toString()); + settings.addProperty(TheurgyConstants.Nbt.Divination.SETTING_ALLOWED_BLOCKS_TAG, defaultAllowedBlocksTag.location().toString()); + settings.addProperty(TheurgyConstants.Nbt.Divination.SETTING_DISALLOWED_BLOCKS_TAG, defaultDisallowedBlocksTag.location().toString()); + settings.addProperty(TheurgyConstants.Nbt.Divination.SETTING_RANGE, defaultRange); + settings.addProperty(TheurgyConstants.Nbt.Divination.SETTING_DURATION, defaultDuration); + settings.addProperty(TheurgyConstants.Nbt.Divination.SETTING_DURABILITY, defaultDurability); + + return settings; + } + + public void makeRecipe(ItemLike result, RecipeBuilder recipe) { + this.makeRecipe(this.name(result.asItem()), recipe); + } + + public void makeRecipe(String name, RecipeBuilder recipe) { + this.recipeConsumer.accept(this.modLoc(name), recipe.build()); + } + + @Override + public String getName() { + return "Shaped Crafting Recipes"; + } + + private class RecipeBuilder { + + private final JsonObject recipe; + + public RecipeBuilder(ItemLike result) { + this(result, 1); + } + + public RecipeBuilder(ItemLike result, int count) { + this(result, count, null); + } + + public RecipeBuilder(ItemLike result, int count, @Nullable JsonObject nbt) { + this(result, count, nbt, ForgeRegistries.RECIPE_SERIALIZERS.getKey(RecipeSerializer.SHAPED_RECIPE).toString()); + } + + public RecipeBuilder(ItemLike result, int count, @Nullable JsonObject nbt, String recipeType) { + this(ShapedRecipeProvider.this.makeItemResult(ShapedRecipeProvider.this.locFor(result), count, nbt), recipeType); + } + + public RecipeBuilder(JsonObject result, String recipeType) { + this.recipe = new JsonObject(); + this.recipe.addProperty("type", recipeType); + this.recipe.add("result", result); + this.recipe.add("key", new JsonObject()); + this.recipe.add("pattern", new JsonArray()); + } + + public RecipeBuilder define(char key, TagKey tag) { + return this.define(key, ShapedRecipeProvider.this.makeTagIngredient(ShapedRecipeProvider.this.locFor(tag))); + } + + public RecipeBuilder define(char key, ItemLike item) { + return this.define(key, ShapedRecipeProvider.this.makeItemIngredient(ShapedRecipeProvider.this.locFor(item))); + } + + public RecipeBuilder define(char key, JsonObject ingredient) { + var keyString = String.valueOf(key); + var keys = this.recipe.getAsJsonObject("key"); + if (keys.has(keyString)) + throw new IllegalArgumentException("Key " + keyString + " already defined"); + + keys.add(keyString, ingredient); + return this; + } + + public RecipeBuilder pattern(String pattern) { + this.recipe.getAsJsonArray("pattern").add(pattern); + return this; + } + + public JsonObject build() { + return this.recipe; + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/recipe/ShapelessRecipeProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/ShapelessRecipeProvider.java new file mode 100644 index 000000000..56f84bd55 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/recipe/ShapelessRecipeProvider.java @@ -0,0 +1,112 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.datagen.recipe; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.klikli_dev.modonomicon.registry.ItemRegistry; +import com.klikli_dev.theurgy.Theurgy; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.level.ItemLike; +import net.minecraftforge.common.Tags; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.Nullable; + +import java.util.function.BiConsumer; + +public class ShapelessRecipeProvider extends JsonRecipeProvider { + + public ShapelessRecipeProvider(PackOutput packOutput) { + super(packOutput, Theurgy.MODID, "crafting/shapeless"); + } + + @Override + void buildRecipes(BiConsumer recipeConsumer) { + + var hermeticaNbt = new JsonObject(); + hermeticaNbt.addProperty("modonomicon:book_id", "theurgy:the_hermetica"); + this.makeRecipe("the_hermetica", + new RecipeBuilder(ItemRegistry.MODONOMICON.get(), 1, hermeticaNbt) + .requires(Items.BOOK) + .requires(Tags.Items.SAND, 2) + ); + + } + + public void makeRecipe(String name, RecipeBuilder recipe) { + this.recipeConsumer.accept(this.modLoc(name), recipe.build()); + } + + @Override + public String getName() { + return "Shapeless Crafting Recipes"; + } + + private class RecipeBuilder { + + JsonObject recipe; + + public RecipeBuilder(ItemLike result) { + this(result, 1); + } + + public RecipeBuilder(ItemLike result, int count) { + this(result, count, null); + } + + public RecipeBuilder(ItemLike result, int count, @Nullable JsonObject nbt) { + this(ShapelessRecipeProvider.this.makeItemResult(ShapelessRecipeProvider.this.locFor(result), count, nbt)); + } + + public RecipeBuilder(JsonObject result) { + this.recipe = new JsonObject(); + this.recipe.addProperty("type", + ForgeRegistries.RECIPE_SERIALIZERS.getKey(RecipeSerializer.SHAPELESS_RECIPE).toString()); + this.recipe.add("result", result); + this.recipe.add("ingredients", new JsonArray()); + } + + public RecipeBuilder requires(TagKey tag, int count) { + for (int i = 0; i < count; ++i) { + this.requires(tag); + } + + return this; + } + + public RecipeBuilder requires(TagKey tag) { + return this.requires(ShapelessRecipeProvider.this.makeTagIngredient(ShapelessRecipeProvider.this.locFor(tag))); + } + + public RecipeBuilder requires(ItemLike item, int count) { + for (int i = 0; i < count; ++i) { + this.requires(item); + } + + return this; + } + + public RecipeBuilder requires(ItemLike item) { + return this.requires(ShapelessRecipeProvider.this.makeItemIngredient(ShapelessRecipeProvider.this.locFor(item))); + } + + public RecipeBuilder requires(JsonObject ingredient) { + this.recipe.getAsJsonArray("ingredients").add(ingredient); + return this; + } + + public JsonObject build() { + return this.recipe; + } + + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/tag/TheurgyBlockTagsProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/tag/TheurgyBlockTagsProvider.java new file mode 100644 index 000000000..65847514e --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/tag/TheurgyBlockTagsProvider.java @@ -0,0 +1,66 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.datagen.tag; + +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.registry.BlockRegistry; +import com.klikli_dev.theurgy.registry.BlockTagRegistry; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.level.block.Blocks; +import net.minecraftforge.common.Tags; +import net.minecraftforge.common.data.BlockTagsProvider; +import net.minecraftforge.common.data.ExistingFileHelper; +import org.jetbrains.annotations.Nullable; + +import java.util.concurrent.CompletableFuture; + +public class TheurgyBlockTagsProvider extends BlockTagsProvider { + public TheurgyBlockTagsProvider(PackOutput output, CompletableFuture lookupProvider, @Nullable ExistingFileHelper existingFileHelper) { + super(output, lookupProvider, Theurgy.MODID, existingFileHelper); + } + + @Override + protected void addTags(HolderLookup.Provider pProvider) { + this.tag(BlockTagRegistry.DIVINATION_ROD_T1_ALLOWED_BLOCKS) + .add(Blocks.SUGAR_CANE) + .addTag(Tags.Blocks.ORES) + .addTag(Tags.Blocks.SAND) + .addTag(Tags.Blocks.STONE) + .addTag(BlockTags.LOGS); + this.tag(BlockTagRegistry.DIVINATION_ROD_T1_DISALLOWED_BLOCKS); + + this.tag(BlockTagRegistry.DIVINATION_ROD_T2_ALLOWED_BLOCKS) + .addTag(BlockTagRegistry.DIVINATION_ROD_T1_ALLOWED_BLOCKS) + .addTag(Tags.Blocks.OBSIDIAN); + this.tag(BlockTagRegistry.DIVINATION_ROD_T2_DISALLOWED_BLOCKS); + + this.tag(BlockTagRegistry.DIVINATION_ROD_T3_ALLOWED_BLOCKS) + .addTag(BlockTagRegistry.DIVINATION_ROD_T2_ALLOWED_BLOCKS); + this.tag(BlockTagRegistry.DIVINATION_ROD_T3_DISALLOWED_BLOCKS); + + this.tag(BlockTagRegistry.DIVINATION_ROD_T4_ALLOWED_BLOCKS) + .addTag(BlockTagRegistry.DIVINATION_ROD_T3_ALLOWED_BLOCKS); + this.tag(BlockTagRegistry.DIVINATION_ROD_T4_DISALLOWED_BLOCKS); + + this.tag(BlockTagRegistry.INCUBATOR_VESSELS) + .add(BlockRegistry.INCUBATOR_MERCURY_VESSEL.get()) + .add(BlockRegistry.INCUBATOR_SALT_VESSEL.get()) + .add(BlockRegistry.INCUBATOR_SULFUR_VESSEL.get()); + + this.tag(BlockTagRegistry.SAL_AMMONIAC_ORES) + .add(BlockRegistry.SAL_AMMONIAC_ORE.get()) + .add(BlockRegistry.DEEPSLATE_SAL_AMMONIAC_ORE.get()); + + this.tag(Tags.Blocks.ORES).addTag(BlockTagRegistry.SAL_AMMONIAC_ORES); + this.tag(Tags.Blocks.ORES_IN_GROUND_STONE).add(BlockRegistry.SAL_AMMONIAC_ORE.get()); + this.tag(Tags.Blocks.ORES_IN_GROUND_DEEPSLATE).add(BlockRegistry.DEEPSLATE_SAL_AMMONIAC_ORE.get()); + this.tag(BlockTags.MINEABLE_WITH_PICKAXE).addTag(BlockTagRegistry.SAL_AMMONIAC_ORES); + this.tag(BlockTags.NEEDS_STONE_TOOL).addTag(BlockTagRegistry.SAL_AMMONIAC_ORES); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/tag/TheurgyFluidTagsProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/tag/TheurgyFluidTagsProvider.java new file mode 100644 index 000000000..7544f8c84 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/tag/TheurgyFluidTagsProvider.java @@ -0,0 +1,30 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.datagen.tag; + +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.registry.FluidRegistry; +import com.klikli_dev.theurgy.registry.FluidTagRegistry; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.data.tags.FluidTagsProvider; +import net.minecraftforge.common.data.ExistingFileHelper; +import org.jetbrains.annotations.Nullable; + +import java.util.concurrent.CompletableFuture; + +public class TheurgyFluidTagsProvider extends FluidTagsProvider { + + public TheurgyFluidTagsProvider(PackOutput output, CompletableFuture lookupProvider, @Nullable ExistingFileHelper existingFileHelper) { + super(output, lookupProvider, Theurgy.MODID, existingFileHelper); + } + + protected void addTags(HolderLookup.Provider pProvider) { + this.tag(FluidTagRegistry.SAL_AMMONIAC).add(FluidRegistry.SAL_AMMONIAC.get(), FluidRegistry.SAL_AMMONIAC_FLOWING.get()); + this.tag(FluidTagRegistry.SOLVENT).addTag(FluidTagRegistry.SAL_AMMONIAC); + } +} \ No newline at end of file diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/tag/TheurgyItemTagsProvider.java b/src/main/java/com/klikli_dev/theurgy/datagen/tag/TheurgyItemTagsProvider.java new file mode 100644 index 000000000..9e5021058 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/tag/TheurgyItemTagsProvider.java @@ -0,0 +1,313 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.datagen.tag; + +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.registry.*; +import net.minecraft.core.HolderLookup; +import net.minecraft.data.PackOutput; +import net.minecraft.data.tags.ItemTagsProvider; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.ItemTags; +import net.minecraft.world.level.block.Block; +import net.minecraftforge.common.Tags; +import net.minecraftforge.common.data.ExistingFileHelper; +import org.jetbrains.annotations.Nullable; + +import java.util.concurrent.CompletableFuture; + +public class TheurgyItemTagsProvider extends ItemTagsProvider { + public TheurgyItemTagsProvider(PackOutput output, CompletableFuture lookupProvider, CompletableFuture> blockTagsProvider, @Nullable ExistingFileHelper existingFileHelper) { + super(output, lookupProvider, blockTagsProvider, Theurgy.MODID, existingFileHelper); + } + + @Override + protected void addTags(HolderLookup.Provider pProvider) { + this.copy(BlockTagRegistry.SAL_AMMONIAC_ORES, ItemTagRegistry.SAL_AMMONIAC_ORES); + this.copy(Tags.Blocks.ORES_IN_GROUND_STONE, Tags.Items.ORES_IN_GROUND_STONE); + this.copy(Tags.Blocks.ORES_IN_GROUND_DEEPSLATE, Tags.Items.ORES_IN_GROUND_DEEPSLATE); + + this.tag(ItemTagRegistry.SAL_AMMONIAC_GEMS) + .add(ItemRegistry.SAL_AMMONIAC_CRYSTAL.get()); + this.tag(Tags.Items.GEMS).addTag(ItemTagRegistry.SAL_AMMONIAC_GEMS); + + var mercuriesTag = this.tag(ItemTagRegistry.ALCHEMICAL_MERCURIES); + ItemRegistry.ITEMS.getEntries().forEach(item -> { + //theoretically this loop is unnecessary, but allows us to apply additional logic in the future + if (item.get() == ItemRegistry.MERCURY_SHARD.get() || item.get() == ItemRegistry.MERCURY_CRYSTAL.get()) + mercuriesTag.add(item.get()); + }); + + var saltsTag = this.tag(ItemTagRegistry.ALCHEMICAL_SALTS); + SaltRegistry.SALTS.getEntries().forEach(salt -> { + saltsTag.add(salt.get()); + }); + + var sulfursTag = this.tag(ItemTagRegistry.ALCHEMICAL_SULFURS); + SulfurRegistry.SULFURS.getEntries().forEach(sulfur -> { + sulfursTag.add(sulfur.get()); + }); + + + //add the tier tags into the material tag + this.tag(ItemTagRegistry.ALCHEMICAL_SULFURS_METALS) + .addOptionalTag(ItemTagRegistry.ALCHEMICAL_SULFURS_METALS_ABUNDANT.location()) + .addOptionalTag(ItemTagRegistry.ALCHEMICAL_SULFURS_METALS_COMMON.location()) + .addOptionalTag(ItemTagRegistry.ALCHEMICAL_SULFURS_METALS_RARE.location()) + .addOptionalTag(ItemTagRegistry.ALCHEMICAL_SULFURS_METALS_PRECIOUS.location()); + + this.tag(ItemTagRegistry.ALCHEMICAL_SULFURS_GEMS) + .addOptionalTag(ItemTagRegistry.ALCHEMICAL_SULFURS_GEMS_ABUNDANT.location()) + .addOptionalTag(ItemTagRegistry.ALCHEMICAL_SULFURS_GEMS_COMMON.location()) + .addOptionalTag(ItemTagRegistry.ALCHEMICAL_SULFURS_GEMS_RARE.location()) + .addOptionalTag(ItemTagRegistry.ALCHEMICAL_SULFURS_GEMS_PRECIOUS.location()); + + this.tag(ItemTagRegistry.ALCHEMICAL_SULFURS_OTHER_MINERALS) + .addOptionalTag(ItemTagRegistry.ALCHEMICAL_SULFURS_OTHER_MINERALS_ABUNDANT.location()) + .addOptionalTag(ItemTagRegistry.ALCHEMICAL_SULFURS_OTHER_MINERALS_COMMON.location()) + .addOptionalTag(ItemTagRegistry.ALCHEMICAL_SULFURS_OTHER_MINERALS_RARE.location()) + .addOptionalTag(ItemTagRegistry.ALCHEMICAL_SULFURS_OTHER_MINERALS_PRECIOUS.location()); + + this.tag(ItemTagRegistry.ALCHEMICAL_SULFURS_METALS_ABUNDANT) + .add(SulfurRegistry.COPPER.get()) + ; + + this.tag(ItemTagRegistry.ALCHEMICAL_SULFURS_METALS_COMMON) + .add(SulfurRegistry.IRON.get()) + .add(SulfurRegistry.TIN.get()) + .add(SulfurRegistry.ZINC.get()) + .add(SulfurRegistry.LEAD.get()) + .add(SulfurRegistry.NICKEL.get()) + .add(SulfurRegistry.CINNABAR.get()) + .add(SulfurRegistry.OSMIUM.get()) + ; + + this.tag(ItemTagRegistry.ALCHEMICAL_SULFURS_METALS_RARE) + .add(SulfurRegistry.CRIMSON_IRON.get()) + .add(SulfurRegistry.SILVER.get()) + .add(SulfurRegistry.GOLD.get()) + .add(SulfurRegistry.URANIUM.get()) + .add(SulfurRegistry.AZURE_SILVER.get()) + .add(SulfurRegistry.IRIDIUM.get()) + .add(SulfurRegistry.PLATINUM.get()) + ; + + this.tag(ItemTagRegistry.ALCHEMICAL_SULFURS_METALS_PRECIOUS) + .add(SulfurRegistry.NETHERITE.get()) + .add(SulfurRegistry.ALLTHEMODIUM.get()) + .add(SulfurRegistry.UNOBTAINIUM.get()) + .add(SulfurRegistry.VIBRANIUM.get()) + ; + + + this.tag(ItemTagRegistry.ALCHEMICAL_SULFURS_GEMS_ABUNDANT) + .add(SulfurRegistry.APATITE.get()) + .add(SulfurRegistry.FLUORITE.get()) + .add(SulfurRegistry.SAL_AMMONIAC.get()) + ; + + this.tag(ItemTagRegistry.ALCHEMICAL_SULFURS_GEMS_COMMON) + .add(SulfurRegistry.QUARTZ.get()) + .add(SulfurRegistry.LAPIS.get()) + ; + + this.tag(ItemTagRegistry.ALCHEMICAL_SULFURS_GEMS_RARE) + .add(SulfurRegistry.PRISMARINE.get()) + .add(SulfurRegistry.AMETHYST.get()) + .add(SulfurRegistry.PERIDOT.get()) + .add(SulfurRegistry.RUBY.get()) + .add(SulfurRegistry.SAPPHIRE.get()) + ; + + this.tag(ItemTagRegistry.ALCHEMICAL_SULFURS_GEMS_PRECIOUS) + .add(SulfurRegistry.DIAMOND.get()) + .add(SulfurRegistry.EMERALD.get()) + ; + + this.tag(ItemTagRegistry.ALCHEMICAL_SULFURS_OTHER_MINERALS_ABUNDANT) + .add(SulfurRegistry.COAL.get()) + ; + + this.tag(ItemTagRegistry.ALCHEMICAL_SULFURS_OTHER_MINERALS_COMMON) + .add(SulfurRegistry.REDSTONE.get()) + .add(SulfurRegistry.SULFUR.get()) + ; + + this.tag(ItemTagRegistry.ALCHEMICAL_SULFURS_OTHER_MINERALS_RARE) + + ; + + this.tag(ItemTagRegistry.ALCHEMICAL_SULFURS_OTHER_MINERALS_PRECIOUS) + + ; + + this.tag(ItemTagRegistry.ALCHEMICAL_SULFURS_ABUNDANT) + .addTag(ItemTagRegistry.ALCHEMICAL_SULFURS_METALS_ABUNDANT) + .addTag(ItemTagRegistry.ALCHEMICAL_SULFURS_GEMS_ABUNDANT) + .addTag(ItemTagRegistry.ALCHEMICAL_SULFURS_OTHER_MINERALS_ABUNDANT) + ; + + this.tag(ItemTagRegistry.ALCHEMICAL_SULFURS_COMMON) + .addTag(ItemTagRegistry.ALCHEMICAL_SULFURS_METALS_COMMON) + .addTag(ItemTagRegistry.ALCHEMICAL_SULFURS_GEMS_COMMON) + .addTag(ItemTagRegistry.ALCHEMICAL_SULFURS_OTHER_MINERALS_COMMON) + ; + + this.tag(ItemTagRegistry.ALCHEMICAL_SULFURS_RARE) + .addTag(ItemTagRegistry.ALCHEMICAL_SULFURS_METALS_RARE) + .addTag(ItemTagRegistry.ALCHEMICAL_SULFURS_GEMS_RARE) + .addTag(ItemTagRegistry.ALCHEMICAL_SULFURS_OTHER_MINERALS_RARE) + ; + + this.tag(ItemTagRegistry.ALCHEMICAL_SULFURS_PRECIOUS) + .addTag(ItemTagRegistry.ALCHEMICAL_SULFURS_METALS_PRECIOUS) + .addTag(ItemTagRegistry.ALCHEMICAL_SULFURS_GEMS_PRECIOUS) + .addTag(ItemTagRegistry.ALCHEMICAL_SULFURS_OTHER_MINERALS_PRECIOUS) + ; + + this.tag(ItemTagRegistry.LOW_MERCURY_ORES) + .addTag(Tags.Items.ORES_IRON) + .addTag(Tags.Items.ORES_COPPER) + .addTag(Tags.Items.ORES_LAPIS) + .addTag(Tags.Items.ORES_QUARTZ) + .addTag(Tags.Items.ORES_REDSTONE) + .addTag(Tags.Items.ORES_COAL) + .addOptionalTag(this.rl("forge:ores/zinc")) + .addOptionalTag(this.rl("forge:ores/osmium")) + .addOptionalTag(this.rl("forge:ores/nickel")) + .addOptionalTag(this.rl("forge:ores/lead")) + .addOptionalTag(this.rl("forge:ores/tin")) + .addOptionalTag(this.rl("forge:ores/cinnabar")) + .addOptionalTag(this.rl("forge:ores/apatite")) + .addOptionalTag(this.rl("forge:ores/sulfur")) + ; + + this.tag(ItemTagRegistry.MEDIUM_MERCURY_ORES) + .addTag(Tags.Items.ORES_GOLD) + .addOptionalTag(this.rl("forge:ores/azure_silver")) + .addOptionalTag(this.rl("forge:ores/silver")) + .addOptionalTag(this.rl("forge:ores/uranium")) + .addOptionalTag(this.rl("forge:ores/iridium")) + .addOptionalTag(this.rl("forge:ores/platinum")) + .addOptionalTag(this.rl("forge:ores/crimson_iron")) + .addOptionalTag(this.rl("forge:ores/ruby")) + .addOptionalTag(this.rl("forge:ores/peridot")) + .addOptionalTag(this.rl("forge:ores/fluorite")) + .addOptionalTag(this.rl("forge:ores/sapphire")) + ; + + this.tag(ItemTagRegistry.HIGH_MERCURY_ORES) + .addTag(Tags.Items.ORES_DIAMOND) + .addTag(Tags.Items.ORES_EMERALD) + .addTag(Tags.Items.ORES_NETHERITE_SCRAP) + .addOptionalTag(this.rl("forge:ores/allthemodium")) + .addOptionalTag(this.rl("forge:ores/unobtainium")) + .addOptionalTag(this.rl("forge:ores/vibranium")) + + ; + + this.tag(ItemTagRegistry.LOW_MERCURY_RAW_MATERIALS) + .addTag(Tags.Items.RAW_MATERIALS_IRON) + .addTag(Tags.Items.RAW_MATERIALS_COPPER) + .addOptionalTag(this.rl("forge:raw_materials/zinc")) + .addOptionalTag(this.rl("forge:raw_materials/osmium")) + .addOptionalTag(this.rl("forge:raw_materials/nickel")) + .addOptionalTag(this.rl("forge:raw_materials/lead")) + .addOptionalTag(this.rl("forge:raw_materials/tin")) + .addOptionalTag(this.rl("forge:raw_materials/cinnabar")) + ; + + this.tag(ItemTagRegistry.MEDIUM_MERCURY_RAW_MATERIALS) + .addTag(Tags.Items.RAW_MATERIALS_GOLD) + .addOptionalTag(this.rl("forge:raw_materials/uranium")) + .addOptionalTag(this.rl("forge:raw_materials/silver")) + .addOptionalTag(this.rl("forge:raw_materials/azure_silver")) + .addOptionalTag(this.rl("forge:raw_materials/iridium")) + .addOptionalTag(this.rl("forge:raw_materials/crimson_iron")) + .addOptionalTag(this.rl("forge:raw_materials/platinum")) + ; + + this.tag(ItemTagRegistry.HIGH_MERCURY_RAW_MATERIALS) + .addOptionalTag(this.rl("forge:raw_materials/allthemodium")) + .addOptionalTag(this.rl("forge:raw_materials/unobtainium")) + .addOptionalTag(this.rl("forge:raw_materials/vibranium")) + ; + + this.tag(ItemTagRegistry.LOW_MERCURY_METALS) + .addTag(Tags.Items.INGOTS_IRON) + .addTag(Tags.Items.INGOTS_COPPER) + .addOptionalTag(this.rl("forge:ingots/zinc")) + .addOptionalTag(this.rl("forge:ingots/osmium")) + .addOptionalTag(this.rl("forge:ingots/nickel")) + .addOptionalTag(this.rl("forge:ingots/lead")) + .addOptionalTag(this.rl("forge:ingots/tin")) + .addOptionalTag(this.rl("forge:ingots/cinnabar")) + ; + + this.tag(ItemTagRegistry.MEDIUM_MERCURY_METALS) + .addTag(Tags.Items.INGOTS_GOLD) + .addOptionalTag(this.rl("forge:ingots/uranium")) + .addOptionalTag(this.rl("forge:ingots/silver")) + .addOptionalTag(this.rl("forge:ingots/azure_silver")) + .addOptionalTag(this.rl("forge:ingots/iridium")) + .addOptionalTag(this.rl("forge:ingots/crimson_iron")) + .addOptionalTag(this.rl("forge:ingots/platinum")) + ; + + this.tag(ItemTagRegistry.HIGH_MERCURY_METALS) + .addTag(Tags.Items.INGOTS_NETHERITE) + .addOptionalTag(this.rl("forge:ingots/allthemodium")) + .addOptionalTag(this.rl("forge:ingots/unobtainium")) + .addOptionalTag(this.rl("forge:ingots/vibranium")) + ; + + this.tag(ItemTagRegistry.LOW_MERCURY_GEMS) + .addTag(Tags.Items.GEMS_LAPIS) + .addTag(Tags.Items.GEMS_QUARTZ) + .addOptionalTag(this.rl("forge:gems/cinnabar")) + .addOptionalTag(this.rl("forge:gems/apatite")) + ; + + this.tag(ItemTagRegistry.MEDIUM_MERCURY_GEMS) + .addTag(Tags.Items.GEMS_AMETHYST) + .addTag(Tags.Items.GEMS_PRISMARINE) + .addTag(ItemTagRegistry.SAL_AMMONIAC_GEMS) + .addOptionalTag(this.rl("forge:gems/ruby")) + .addOptionalTag(this.rl("forge:gems/peridot")) + .addOptionalTag(this.rl("forge:gems/fluorite")) + .addOptionalTag(this.rl("forge:gems/sapphire")) + ; + + this.tag(ItemTagRegistry.HIGH_MERCURY_GEMS) + .addTag(Tags.Items.GEMS_DIAMOND) + .addTag(Tags.Items.GEMS_EMERALD) + ; + + this.tag(ItemTagRegistry.LOW_MERCURY_OTHER_MINERALS) + .addTag(ItemTags.COALS) + .addTag(Tags.Items.DUSTS_REDSTONE) + ; + + this.tag(ItemTagRegistry.MEDIUM_MERCURY_OTHER_MINERALS) + .addOptionalTag(this.rl("forge:gems/sulfur")) + ; + + this.tag(ItemTagRegistry.HIGH_MERCURY_OTHER_MINERALS) + ; + + this.tag(ItemTagRegistry.OTHER_MINERALS) + .addTag(ItemTags.COALS) + .addTag(Tags.Items.DUSTS_REDSTONE) + //.addOptionalTag(this.rl("forge:gems/sulfur")) sulfur is classified as a gem, so its handled in the Tags.Items.GEMS + ; + + } + + public ResourceLocation rl(String tag) { + return new ResourceLocation(tag); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/worldgen/BiomeModifiers.java b/src/main/java/com/klikli_dev/theurgy/datagen/worldgen/BiomeModifiers.java new file mode 100644 index 000000000..3024569fc --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/worldgen/BiomeModifiers.java @@ -0,0 +1,34 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.datagen.worldgen; + +import com.klikli_dev.theurgy.Theurgy; +import net.minecraft.core.HolderSet; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.resources.ResourceKey; +import net.minecraft.tags.BiomeTags; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraftforge.common.world.BiomeModifier; +import net.minecraftforge.common.world.ForgeBiomeModifiers; +import net.minecraftforge.registries.ForgeRegistries; + +public class BiomeModifiers { + + public static final ResourceKey ADD_SAL_AMMONIAC_ORE = ResourceKey.create(ForgeRegistries.Keys.BIOME_MODIFIERS, Theurgy.loc("add_sal_ammoniac_ore")); + + + public static void bootstrap(BootstapContext context) { + var placedFeatures = context.lookup(Registries.PLACED_FEATURE); + var biomes = context.lookup(Registries.BIOME); + + context.register(ADD_SAL_AMMONIAC_ORE, new ForgeBiomeModifiers.AddFeaturesBiomeModifier( + biomes.getOrThrow(BiomeTags.IS_OVERWORLD), + HolderSet.direct(placedFeatures.getOrThrow(PlacedFeatures.SAL_AMMONIAC_ORE)), + GenerationStep.Decoration.UNDERGROUND_ORES)); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/worldgen/ConfiguredFeatures.java b/src/main/java/com/klikli_dev/theurgy/datagen/worldgen/ConfiguredFeatures.java new file mode 100644 index 000000000..b0e05faec --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/worldgen/ConfiguredFeatures.java @@ -0,0 +1,36 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.datagen.worldgen; + +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.registry.BlockRegistry; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.data.worldgen.features.FeatureUtils; +import net.minecraft.resources.ResourceKey; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.feature.Feature; +import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration; +import net.minecraft.world.level.levelgen.structure.templatesystem.TagMatchTest; + +import java.util.List; + +public class ConfiguredFeatures { + public static final ResourceKey> SAL_AMMONIAC_ORE = ResourceKey.create(Registries.CONFIGURED_FEATURE, Theurgy.loc("sal_ammoniac_ore")); + + public static void bootstrap(BootstapContext> context) { + var placedFeatures = context.lookup(Registries.PLACED_FEATURE); + + List salAmmoniacOres = List.of( + OreConfiguration.target(new TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES), BlockRegistry.SAL_AMMONIAC_ORE.get().defaultBlockState()), + OreConfiguration.target(new TagMatchTest(BlockTags.DEEPSLATE_ORE_REPLACEABLES), BlockRegistry.DEEPSLATE_SAL_AMMONIAC_ORE.get().defaultBlockState())); + + FeatureUtils.register(context, SAL_AMMONIAC_ORE, Feature.ORE, new OreConfiguration(salAmmoniacOres, 9)); + } + +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/worldgen/PlacedFeatures.java b/src/main/java/com/klikli_dev/theurgy/datagen/worldgen/PlacedFeatures.java new file mode 100644 index 000000000..39ed1acc7 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/worldgen/PlacedFeatures.java @@ -0,0 +1,40 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.datagen.worldgen; + +import com.klikli_dev.theurgy.Theurgy; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.data.worldgen.placement.PlacementUtils; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.levelgen.VerticalAnchor; +import net.minecraft.world.level.levelgen.placement.*; + +import java.util.List; + +public class PlacedFeatures { + public static final ResourceKey SAL_AMMONIAC_ORE = ResourceKey.create(Registries.PLACED_FEATURE, Theurgy.loc("sal_ammoniac_ore")); + + + public static void bootstrap(BootstapContext context) { + var configuredFeatures = context.lookup(Registries.CONFIGURED_FEATURE); + PlacementUtils.register(context, SAL_AMMONIAC_ORE, configuredFeatures.getOrThrow(ConfiguredFeatures.SAL_AMMONIAC_ORE), + commonOrePlacement(20, HeightRangePlacement.triangle(VerticalAnchor.absolute(-64), VerticalAnchor.absolute(200)))); + } + + private static List orePlacement(PlacementModifier rarity, PlacementModifier height) { + return List.of(rarity, InSquarePlacement.spread(), height, BiomeFilter.biome()); + } + + private static List commonOrePlacement(int pCount, PlacementModifier pHeightRange) { + return orePlacement(CountPlacement.of(pCount), pHeightRange); + } + + private static List rareOrePlacement(int pChance, PlacementModifier pHeightRange) { + return orePlacement(RarityFilter.onAverageOnceEvery(pChance), pHeightRange); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/datagen/worldgen/TheurgyRegistries.java b/src/main/java/com/klikli_dev/theurgy/datagen/worldgen/TheurgyRegistries.java new file mode 100644 index 000000000..f2886f66d --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/datagen/worldgen/TheurgyRegistries.java @@ -0,0 +1,25 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.datagen.worldgen; + +import net.minecraft.core.RegistrySetBuilder; +import net.minecraft.core.registries.Registries; +import net.minecraft.data.worldgen.BootstapContext; +import net.minecraft.world.level.biome.Biome; +import net.minecraftforge.registries.ForgeRegistries; + +public class TheurgyRegistries { + public static final RegistrySetBuilder BUILDER = (new RegistrySetBuilder()) + .add(Registries.CONFIGURED_FEATURE, ConfiguredFeatures::bootstrap) + .add(Registries.PLACED_FEATURE, PlacedFeatures::bootstrap) + .add(Registries.BIOME, TheurgyRegistries::bootstrapBiomes) + .add(ForgeRegistries.Keys.BIOME_MODIFIERS, BiomeModifiers::bootstrap); + + public static void bootstrapBiomes(BootstapContext context) { + //doesn't need to do anything, just gives us access to a biome registry with empty tag lookup in our other boopstrap contexts + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/integration/almostunified/AlmostUnifiedIntegration.java b/src/main/java/com/klikli_dev/theurgy/integration/almostunified/AlmostUnifiedIntegration.java new file mode 100644 index 000000000..9635b35e8 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/integration/almostunified/AlmostUnifiedIntegration.java @@ -0,0 +1,35 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.integration.almostunified; + +import com.almostreliable.unified.api.AlmostUnifiedLookup; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraftforge.fml.ModList; +import org.jetbrains.annotations.Nullable; + +public class AlmostUnifiedIntegration { + public static boolean isLoaded() { + return ModList.get().isLoaded("almostunified"); + } + + @Nullable + public static Item getPreferredItemForTag(TagKey tag) { + if (isLoaded()) { + return AlmostUnifiedHelper.getPreferredItemForTag(tag); + } + + return null; + } + + public static class AlmostUnifiedHelper { + @Nullable + public static Item getPreferredItemForTag(TagKey tag) { + return AlmostUnifiedLookup.INSTANCE.getPreferredItemForTag(tag); + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/integration/jei/DivinationRodSubtypeInterpreter.java b/src/main/java/com/klikli_dev/theurgy/integration/jei/DivinationRodSubtypeInterpreter.java index 0dedaf3f3..6d1657832 100644 --- a/src/main/java/com/klikli_dev/theurgy/integration/jei/DivinationRodSubtypeInterpreter.java +++ b/src/main/java/com/klikli_dev/theurgy/integration/jei/DivinationRodSubtypeInterpreter.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022 klikli-dev + * SPDX-FileCopyrightText: 2023 klikli-dev * * SPDX-License-Identifier: MIT */ diff --git a/src/main/java/com/klikli_dev/theurgy/integration/jei/JeiDrawables.java b/src/main/java/com/klikli_dev/theurgy/integration/jei/JeiDrawables.java new file mode 100644 index 000000000..cb3815b72 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/integration/jei/JeiDrawables.java @@ -0,0 +1,50 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.integration.jei; + +import com.klikli_dev.theurgy.content.gui.GuiTextures; +import mezz.jei.api.gui.drawable.IDrawable; +import mezz.jei.api.gui.drawable.IDrawableAnimated; +import mezz.jei.api.gui.drawable.IDrawableStatic; +import mezz.jei.api.helpers.IGuiHelper; +import net.minecraft.client.gui.GuiGraphics; + +/** + * Helpts to get Jei Drawables for scenarios where we don't render stuff "raw" but instead pass it to JEI. + * E.g. Slot Backgrounds + */ +public class JeiDrawables { + public static final IDrawable INPUT_SLOT = asDrawable(GuiTextures.JEI_INPUT_SLOT); + public static final IDrawable OUTPUT_SLOT = asDrawable(GuiTextures.JEI_OUTPUT_SLOT); + + protected static IDrawable asDrawable(GuiTextures texture) { + return new IDrawable() { + @Override + public int getWidth() { + return texture.width; + } + + @Override + public int getHeight() { + return texture.height; + } + + @Override + public void draw(GuiGraphics guiGraphics, int xOffset, int yOffset) { + texture.render(guiGraphics, xOffset, yOffset); + } + }; + } + + public static IDrawableStatic asStaticDrawable(IGuiHelper helper, GuiTextures texture) { + return helper.createDrawable(texture.location, texture.x, texture.y, texture.width, texture.height); + } + + public static IDrawableAnimated asAnimatedDrawable(IGuiHelper helper, GuiTextures texture, int ticksPerCycle, IDrawableAnimated.StartDirection startDirection, boolean inverted) { + return helper.createAnimatedDrawable(asStaticDrawable(helper, texture), ticksPerCycle, startDirection, inverted); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/integration/jei/JeiPlugin.java b/src/main/java/com/klikli_dev/theurgy/integration/jei/JeiPlugin.java index 0a27372c9..34e3ffc77 100644 --- a/src/main/java/com/klikli_dev/theurgy/integration/jei/JeiPlugin.java +++ b/src/main/java/com/klikli_dev/theurgy/integration/jei/JeiPlugin.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022 klikli-dev + * SPDX-FileCopyrightText: 2023 klikli-dev * * SPDX-License-Identifier: MIT */ @@ -7,21 +7,109 @@ package com.klikli_dev.theurgy.integration.jei; import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.content.item.AlchemicalSulfurItem; +import com.klikli_dev.theurgy.content.item.DivinationRodItem; +import com.klikli_dev.theurgy.integration.jei.recipes.*; +import com.klikli_dev.theurgy.registry.BlockRegistry; import com.klikli_dev.theurgy.registry.ItemRegistry; +import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; +import com.klikli_dev.theurgy.registry.SulfurRegistry; import mezz.jei.api.IModPlugin; +import mezz.jei.api.constants.VanillaTypes; +import mezz.jei.api.registration.IRecipeCatalystRegistration; +import mezz.jei.api.registration.IRecipeCategoryRegistration; +import mezz.jei.api.registration.IRecipeRegistration; import mezz.jei.api.registration.ISubtypeRegistration; +import net.minecraft.client.Minecraft; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.ItemLike; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; +import org.jetbrains.annotations.NotNull; @mezz.jei.api.JeiPlugin public class JeiPlugin implements IModPlugin { @Override - public ResourceLocation getPluginUid() { + public @NotNull ResourceLocation getPluginUid() { return Theurgy.loc("jei_plugin"); } @Override - public void registerItemSubtypes(ISubtypeRegistration registration) { - registration.registerSubtypeInterpreter(ItemRegistry.DIVINATION_ROD_T1.get(), DivinationRodSubtypeInterpreter.get()); - registration.registerSubtypeInterpreter(ItemRegistry.DIVINATION_ROD_T4.get(), DivinationRodSubtypeInterpreter.get()); + public void registerItemSubtypes(@NotNull ISubtypeRegistration registration) { + ItemRegistry.ITEMS.getEntries().stream().filter(item -> item.get() instanceof DivinationRodItem).forEach(item -> { + registration.registerSubtypeInterpreter(item.get(), DivinationRodSubtypeInterpreter.get()); + Theurgy.LOGGER.debug("Registered Divination Rod JEI Subtype Interpreter for: {}", item.getKey()); + }); + + SulfurRegistry.SULFURS.getEntries().stream().forEach(sulfur -> { + registration.useNbtForSubtypes(sulfur.get()); + }); + } + + @Override + public void registerCategories(IRecipeCategoryRegistration registration) { + registration.addRecipeCategories(new CalcinationCategory(registration.getJeiHelpers().getGuiHelper())); + registration.addRecipeCategories(new LiquefactionCategory(registration.getJeiHelpers().getGuiHelper())); + registration.addRecipeCategories(new DistillationCategory(registration.getJeiHelpers().getGuiHelper())); + registration.addRecipeCategories(new IncubationCategory(registration.getJeiHelpers().getGuiHelper())); + registration.addRecipeCategories(new AccumulationCategory(registration.getJeiHelpers().getGuiHelper())); } + + @Override + public void registerRecipes(IRecipeRegistration registration) { + var level = Minecraft.getInstance().level; + var recipeManager = level.getRecipeManager(); + + var calcinationRecipes = recipeManager.getAllRecipesFor(RecipeTypeRegistry.CALCINATION.get()); + registration.addRecipes(JeiRecipeTypes.CALCINATION, calcinationRecipes); + + var liquefactionRecipes = recipeManager.getAllRecipesFor(RecipeTypeRegistry.LIQUEFACTION.get()); + registration.addRecipes(JeiRecipeTypes.LIQUEFACTION, liquefactionRecipes); + + var distillationRecipes = recipeManager.getAllRecipesFor(RecipeTypeRegistry.DISTILLATION.get()); + registration.addRecipes(JeiRecipeTypes.DISTILLATION, distillationRecipes); + + var incubationRecipes = recipeManager.getAllRecipesFor(RecipeTypeRegistry.INCUBATION.get()); + registration.addRecipes(JeiRecipeTypes.INCUBATION, incubationRecipes); + + var accumulationRecipes = recipeManager.getAllRecipesFor(RecipeTypeRegistry.ACCUMULATION.get()); + registration.addRecipes(JeiRecipeTypes.ACCUMULATION, accumulationRecipes); + + //now remove sulfurs that have no recipe -> otherwise we see "no source" sulfurs in tag recipes + //See also Theurgy.Client#onRecipesUpdated + var sulfursWithoutRecipe = SulfurRegistry.SULFURS.getEntries().stream() + .map(RegistryObject::get) + .map(AlchemicalSulfurItem.class::cast) + .filter(sulfur -> liquefactionRecipes.stream().noneMatch(r -> r.getResultItem(level.registryAccess()) != null && r.getResultItem(level.registryAccess()).getItem() == sulfur)).map(ItemStack::new).toList(); + registration.getIngredientManager().removeIngredientsAtRuntime(VanillaTypes.ITEM_STACK, sulfursWithoutRecipe); + + + this.registerIngredientInfo(registration, ItemRegistry.SAL_AMMONIAC_CRYSTAL.get()); + } + + public void registerIngredientInfo(IRecipeRegistration registration, ItemLike ingredient) { + registration.addIngredientInfo(new ItemStack(ingredient.asItem()), VanillaTypes.ITEM_STACK, + Component.translatable("jei." + Theurgy.MODID + ".ingredient." + ForgeRegistries.ITEMS.getKey(ingredient.asItem()).getPath() + ".description")); + } + + @Override + public void registerRecipeCatalysts(IRecipeCatalystRegistration registration) { + registration.addRecipeCatalyst(new ItemStack(BlockRegistry.CALCINATION_OVEN.get()), + JeiRecipeTypes.CALCINATION); + + registration.addRecipeCatalyst(new ItemStack(BlockRegistry.LIQUEFACTION_CAULDRON.get()), + JeiRecipeTypes.LIQUEFACTION); + + registration.addRecipeCatalyst(new ItemStack(BlockRegistry.DISTILLER.get()), + JeiRecipeTypes.DISTILLATION); + + registration.addRecipeCatalyst(new ItemStack(BlockRegistry.INCUBATOR.get()), + JeiRecipeTypes.INCUBATION); + + registration.addRecipeCatalyst(new ItemStack(BlockRegistry.SAL_AMMONIAC_ACCUMULATOR.get()), + JeiRecipeTypes.ACCUMULATION); + } + } diff --git a/src/main/java/com/klikli_dev/theurgy/integration/jei/JeiRecipeTypes.java b/src/main/java/com/klikli_dev/theurgy/integration/jei/JeiRecipeTypes.java new file mode 100644 index 000000000..2ebfdd5ad --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/integration/jei/JeiRecipeTypes.java @@ -0,0 +1,19 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.integration.jei; + +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.content.recipe.*; +import mezz.jei.api.recipe.RecipeType; + +public class JeiRecipeTypes { + public static final RecipeType CALCINATION = RecipeType.create(Theurgy.MODID, "calcination", CalcinationRecipe.class); + public static final RecipeType LIQUEFACTION = RecipeType.create(Theurgy.MODID, "liquefaction", LiquefactionRecipe.class); + public static final RecipeType DISTILLATION = RecipeType.create(Theurgy.MODID, "distillation", DistillationRecipe.class); + public static final RecipeType INCUBATION = RecipeType.create(Theurgy.MODID, "incubation", IncubationRecipe.class); + public static final RecipeType ACCUMULATION = RecipeType.create(Theurgy.MODID, "accumulation", AccumulationRecipe.class); +} diff --git a/src/main/java/com/klikli_dev/theurgy/integration/jei/recipes/AccumulationCategory.java b/src/main/java/com/klikli_dev/theurgy/integration/jei/recipes/AccumulationCategory.java new file mode 100644 index 000000000..767c48a9a --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/integration/jei/recipes/AccumulationCategory.java @@ -0,0 +1,153 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.integration.jei.recipes; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.klikli_dev.theurgy.TheurgyConstants; +import com.klikli_dev.theurgy.content.gui.GuiTextures; +import com.klikli_dev.theurgy.content.recipe.AccumulationRecipe; +import com.klikli_dev.theurgy.integration.jei.JeiDrawables; +import com.klikli_dev.theurgy.integration.jei.JeiRecipeTypes; +import com.klikli_dev.theurgy.registry.BlockRegistry; +import mezz.jei.api.forge.ForgeTypes; +import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; +import mezz.jei.api.gui.drawable.IDrawable; +import mezz.jei.api.gui.drawable.IDrawableAnimated; +import mezz.jei.api.gui.ingredient.IRecipeSlotTooltipCallback; +import mezz.jei.api.gui.ingredient.IRecipeSlotsView; +import mezz.jei.api.helpers.IGuiHelper; +import mezz.jei.api.recipe.IFocusGroup; +import mezz.jei.api.recipe.RecipeType; +import mezz.jei.api.recipe.category.IRecipeCategory; +import net.minecraft.ChatFormatting; +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.item.ItemStack; + +import java.util.List; + +import static mezz.jei.api.recipe.RecipeIngredientRole.INPUT; +import static mezz.jei.api.recipe.RecipeIngredientRole.OUTPUT; + +public class AccumulationCategory implements IRecipeCategory { + private final IDrawable background; + private final IDrawable icon; + private final Component localizedName; + private final LoadingCache cachedAnimatedArrow; + + public AccumulationCategory(IGuiHelper guiHelper) { + this.background = guiHelper.createBlankDrawable(82, 40); + + this.icon = guiHelper.createDrawableItemStack(new ItemStack(BlockRegistry.SAL_AMMONIAC_ACCUMULATOR.get())); + this.localizedName = Component.translatable(TheurgyConstants.I18n.JEI.ACCUMULATION_CATEGORY); + + //We need different animations for different cook times, hence the cache + this.cachedAnimatedArrow = CacheBuilder.newBuilder() + .maximumSize(25) + .build(new CacheLoader<>() { + @Override + public IDrawableAnimated load(Integer cookTime) { + return JeiDrawables.asAnimatedDrawable(guiHelper, GuiTextures.JEI_ARROW_RIGHT_FULL, cookTime, IDrawableAnimated.StartDirection.LEFT, false); + } + }); + } + + public static IRecipeSlotTooltipCallback addFluidTooltip(int overrideAmount) { + return (view, tooltip) -> { + var displayed = view.getDisplayedIngredient(ForgeTypes.FLUID_STACK); + if (displayed.isEmpty()) + return; + + var fluidStack = displayed.get(); + + var amount = overrideAmount == -1 ? fluidStack.getAmount() : overrideAmount; + var text = Component.translatable(TheurgyConstants.I18n.Misc.UNIT_MILLIBUCKETS, amount).withStyle(ChatFormatting.GOLD); + if (tooltip.isEmpty()) + tooltip.add(0, text); + else { + List siblings = tooltip.get(0).getSiblings(); + siblings.add(Component.literal(" ")); + siblings.add(text); + } + }; + } + + protected IDrawableAnimated getAnimatedArrow(AccumulationRecipe recipe) { + int cookTime = recipe.getAccumulationTime(); + if (cookTime <= 0) { + cookTime = AccumulationRecipe.DEFAULT_ACCUMULATION_TIME; + } + return this.cachedAnimatedArrow.getUnchecked(cookTime); + } + + @Override + public IDrawable getBackground() { + return this.background; + } + + @Override + public IDrawable getIcon() { + return this.icon; + } + + @Override + public void draw(AccumulationRecipe recipe, IRecipeSlotsView recipeSlotsView, GuiGraphics guiGraphics, double mouseX, double mouseY) { + GuiTextures.JEI_ARROW_RIGHT_EMPTY.render(guiGraphics, 24, 2); + this.getAnimatedArrow(recipe).draw(guiGraphics, 24, 2); + + this.drawCookTime(recipe, guiGraphics, 29); + } + + protected void drawCookTime(AccumulationRecipe recipe, GuiGraphics guiGraphics, int y) { + int cookTime = recipe.getAccumulationTime(); + if (cookTime > 0) { + int cookTimeSeconds = cookTime / 20; + Component timeString = Component.translatable("gui.jei.category.smelting.time.seconds", cookTimeSeconds); + Minecraft minecraft = Minecraft.getInstance(); + Font font = minecraft.font; + int stringWidth = font.width(timeString); + guiGraphics.drawString(font, timeString, this.background.getWidth() - stringWidth, y, 0xFF808080, false); + } + } + + @Override + public Component getTitle() { + return this.localizedName; + } + + @Override + public void setRecipe(IRecipeLayoutBuilder builder, AccumulationRecipe recipe, IFocusGroup focuses) { + builder.addSlot(INPUT, 1, 1) + .setBackground(JeiDrawables.INPUT_SLOT, -1, -1) + .addIngredients(ForgeTypes.FLUID_STACK, List.of(recipe.getEvaporant().getFluids())) + .addTooltipCallback(addFluidTooltip(recipe.getEvaporant().getAmount())); + + if (recipe.hasSolute()) { + builder.addSlot(INPUT, 1, 21) + .setBackground(JeiDrawables.INPUT_SLOT, -1, -1) + .addIngredients(recipe.getSolute()); + } + + builder.addSlot(OUTPUT, 56, 1) + .setBackground(JeiDrawables.INPUT_SLOT, -1, -1) + .addFluidStack(recipe.getResult().getFluid(), recipe.getResult().getAmount()) + .addTooltipCallback(addFluidTooltip(recipe.getResult().getAmount())); + + //now add the bucket to the recipe lookup for the output fluid + builder.addInvisibleIngredients(OUTPUT).addItemStack(new ItemStack(recipe.getResult().getFluid().getBucket())); + } + + @Override + public RecipeType getRecipeType() { + return JeiRecipeTypes.ACCUMULATION; + } + +} diff --git a/src/main/java/com/klikli_dev/theurgy/integration/jei/recipes/CalcinationCategory.java b/src/main/java/com/klikli_dev/theurgy/integration/jei/recipes/CalcinationCategory.java new file mode 100644 index 000000000..e7c244857 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/integration/jei/recipes/CalcinationCategory.java @@ -0,0 +1,125 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.integration.jei.recipes; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.klikli_dev.theurgy.TheurgyConstants; +import com.klikli_dev.theurgy.content.gui.GuiTextures; +import com.klikli_dev.theurgy.content.recipe.CalcinationRecipe; +import com.klikli_dev.theurgy.integration.jei.JeiDrawables; +import com.klikli_dev.theurgy.integration.jei.JeiRecipeTypes; +import com.klikli_dev.theurgy.registry.BlockRegistry; +import mezz.jei.api.constants.VanillaTypes; +import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; +import mezz.jei.api.gui.drawable.IDrawable; +import mezz.jei.api.gui.drawable.IDrawableAnimated; +import mezz.jei.api.gui.ingredient.IRecipeSlotsView; +import mezz.jei.api.helpers.IGuiHelper; +import mezz.jei.api.recipe.IFocusGroup; +import mezz.jei.api.recipe.RecipeType; +import mezz.jei.api.recipe.category.IRecipeCategory; +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.item.ItemStack; + +import java.util.Arrays; + +import static mezz.jei.api.recipe.RecipeIngredientRole.INPUT; +import static mezz.jei.api.recipe.RecipeIngredientRole.OUTPUT; + +public class CalcinationCategory implements IRecipeCategory { + private final IDrawableAnimated animatedFire; + private final IDrawable background; + private final IDrawable icon; + private final Component localizedName; + private final LoadingCache cachedAnimatedArrow; + + public CalcinationCategory(IGuiHelper guiHelper) { + this.background = guiHelper.createBlankDrawable(82, 43); + + this.animatedFire = JeiDrawables.asAnimatedDrawable(guiHelper, GuiTextures.JEI_FIRE_FULL, 300, IDrawableAnimated.StartDirection.TOP, true); + + this.icon = guiHelper.createDrawableItemStack(new ItemStack(BlockRegistry.CALCINATION_OVEN.get())); + this.localizedName = Component.translatable(TheurgyConstants.I18n.JEI.CALCINATION_CATEGORY); + + //We need different animations for different cook times, hence the cache + this.cachedAnimatedArrow = CacheBuilder.newBuilder() + .maximumSize(25) + .build(new CacheLoader<>() { + @Override + public IDrawableAnimated load(Integer cookTime) { + return JeiDrawables.asAnimatedDrawable(guiHelper, GuiTextures.JEI_ARROW_RIGHT_FULL, cookTime, IDrawableAnimated.StartDirection.LEFT, false); + } + }); + } + + protected IDrawableAnimated getAnimatedArrow(CalcinationRecipe recipe) { + int cookTime = recipe.getCalcinationTime(); + if (cookTime <= 0) { + cookTime = CalcinationRecipe.DEFAULT_CALCINATION_TIME; + } + return this.cachedAnimatedArrow.getUnchecked(cookTime); + } + + @Override + public IDrawable getBackground() { + return this.background; + } + + @Override + public IDrawable getIcon() { + return this.icon; + } + + @Override + public void draw(CalcinationRecipe recipe, IRecipeSlotsView recipeSlotsView, GuiGraphics guiGraphics, double mouseX, double mouseY) { + GuiTextures.JEI_FIRE_EMPTY.render(guiGraphics, 1, 20); + this.animatedFire.draw(guiGraphics, 1, 20); + + GuiTextures.JEI_ARROW_RIGHT_EMPTY.render(guiGraphics, 24, 8); + this.getAnimatedArrow(recipe).draw(guiGraphics, 24, 8); + + this.drawCookTime(recipe, guiGraphics, 34); + } + + protected void drawCookTime(CalcinationRecipe recipe, GuiGraphics guiGraphics, int y) { + int cookTime = recipe.getCalcinationTime(); + if (cookTime > 0) { + int cookTimeSeconds = cookTime / 20; + Component timeString = Component.translatable("gui.jei.category.smelting.time.seconds", cookTimeSeconds); + Minecraft minecraft = Minecraft.getInstance(); + Font font = minecraft.font; + int stringWidth = font.width(timeString); + guiGraphics.drawString(font, timeString, this.background.getWidth() - stringWidth, y, 0xFF808080, false); + } + } + + @Override + public Component getTitle() { + return this.localizedName; + } + + @Override + public void setRecipe(IRecipeLayoutBuilder builder, CalcinationRecipe recipe, IFocusGroup focuses) { + builder.addSlot(INPUT, 1, 1) + .setBackground(JeiDrawables.INPUT_SLOT, -1, -1) + .addIngredients(VanillaTypes.ITEM_STACK, Arrays.stream(recipe.getIngredients().get(0).getItems()).map(i -> i.copyWithCount(recipe.getIngredientCount())).toList()); + + builder.addSlot(OUTPUT, 61, 9) + .setBackground(JeiDrawables.OUTPUT_SLOT, -5, -5) + .addItemStack(recipe.getResultItem(Minecraft.getInstance().level.registryAccess())); + } + + @Override + public RecipeType getRecipeType() { + return JeiRecipeTypes.CALCINATION; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/integration/jei/recipes/DistillationCategory.java b/src/main/java/com/klikli_dev/theurgy/integration/jei/recipes/DistillationCategory.java new file mode 100644 index 000000000..10f1098a8 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/integration/jei/recipes/DistillationCategory.java @@ -0,0 +1,125 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.integration.jei.recipes; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.klikli_dev.theurgy.TheurgyConstants; +import com.klikli_dev.theurgy.content.gui.GuiTextures; +import com.klikli_dev.theurgy.content.recipe.DistillationRecipe; +import com.klikli_dev.theurgy.integration.jei.JeiDrawables; +import com.klikli_dev.theurgy.integration.jei.JeiRecipeTypes; +import com.klikli_dev.theurgy.registry.BlockRegistry; +import mezz.jei.api.constants.VanillaTypes; +import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; +import mezz.jei.api.gui.drawable.IDrawable; +import mezz.jei.api.gui.drawable.IDrawableAnimated; +import mezz.jei.api.gui.ingredient.IRecipeSlotsView; +import mezz.jei.api.helpers.IGuiHelper; +import mezz.jei.api.recipe.IFocusGroup; +import mezz.jei.api.recipe.RecipeType; +import mezz.jei.api.recipe.category.IRecipeCategory; +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.item.ItemStack; + +import java.util.Arrays; + +import static mezz.jei.api.recipe.RecipeIngredientRole.INPUT; +import static mezz.jei.api.recipe.RecipeIngredientRole.OUTPUT; + +public class DistillationCategory implements IRecipeCategory { + private final IDrawableAnimated animatedFire; + private final IDrawable background; + private final IDrawable icon; + private final Component localizedName; + private final LoadingCache cachedAnimatedArrow; + + public DistillationCategory(IGuiHelper guiHelper) { + this.background = guiHelper.createBlankDrawable(82, 43); + + this.animatedFire = JeiDrawables.asAnimatedDrawable(guiHelper, GuiTextures.JEI_FIRE_FULL, 300, IDrawableAnimated.StartDirection.TOP, true); + + this.icon = guiHelper.createDrawableItemStack(new ItemStack(BlockRegistry.DISTILLER.get())); + this.localizedName = Component.translatable(TheurgyConstants.I18n.JEI.DISTILLATION_CATEGORY); + + //We need different animations for different cook times, hence the cache + this.cachedAnimatedArrow = CacheBuilder.newBuilder() + .maximumSize(25) + .build(new CacheLoader<>() { + @Override + public IDrawableAnimated load(Integer cookTime) { + return JeiDrawables.asAnimatedDrawable(guiHelper, GuiTextures.JEI_ARROW_RIGHT_FULL, cookTime, IDrawableAnimated.StartDirection.LEFT, false); + } + }); + } + + protected IDrawableAnimated getAnimatedArrow(DistillationRecipe recipe) { + int cookTime = recipe.getDistillationTime(); + if (cookTime <= 0) { + cookTime = DistillationRecipe.DEFAULT_DISTILLATION_TIME; + } + return this.cachedAnimatedArrow.getUnchecked(cookTime); + } + + @Override + public IDrawable getBackground() { + return this.background; + } + + @Override + public IDrawable getIcon() { + return this.icon; + } + + @Override + public void draw(DistillationRecipe recipe, IRecipeSlotsView recipeSlotsView, GuiGraphics guiGraphics, double mouseX, double mouseY) { + GuiTextures.JEI_FIRE_EMPTY.render(guiGraphics, 1, 20); + this.animatedFire.draw(guiGraphics, 1, 20); + + GuiTextures.JEI_ARROW_RIGHT_EMPTY.render(guiGraphics, 24, 8); + this.getAnimatedArrow(recipe).draw(guiGraphics, 24, 8); + + this.drawCookTime(recipe, guiGraphics, 34); + } + + protected void drawCookTime(DistillationRecipe recipe, GuiGraphics guiGraphics, int y) { + int cookTime = recipe.getDistillationTime(); + if (cookTime > 0) { + int cookTimeSeconds = cookTime / 20; + Component timeString = Component.translatable("gui.jei.category.smelting.time.seconds", cookTimeSeconds); + Minecraft minecraft = Minecraft.getInstance(); + Font font = minecraft.font; + int stringWidth = font.width(timeString); + guiGraphics.drawString(font, timeString, this.background.getWidth() - stringWidth, y, 0xFF808080, false); + } + } + + @Override + public Component getTitle() { + return this.localizedName; + } + + @Override + public void setRecipe(IRecipeLayoutBuilder builder, DistillationRecipe recipe, IFocusGroup focuses) { + builder.addSlot(INPUT, 1, 1) + .setBackground(JeiDrawables.INPUT_SLOT, -1, -1) + .addIngredients(VanillaTypes.ITEM_STACK, Arrays.stream(recipe.getIngredient().getItems()).map(i -> i.copyWithCount(recipe.getIngredientCount())).toList()); + + builder.addSlot(OUTPUT, 61, 9) + .setBackground(JeiDrawables.OUTPUT_SLOT, -5, -5) + .addItemStack(recipe.getResultItem(Minecraft.getInstance().level.registryAccess())); + } + + @Override + public RecipeType getRecipeType() { + return JeiRecipeTypes.DISTILLATION; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/integration/jei/recipes/IncubationCategory.java b/src/main/java/com/klikli_dev/theurgy/integration/jei/recipes/IncubationCategory.java new file mode 100644 index 000000000..bd82970a2 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/integration/jei/recipes/IncubationCategory.java @@ -0,0 +1,155 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.integration.jei.recipes; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.klikli_dev.theurgy.TheurgyConstants; +import com.klikli_dev.theurgy.content.gui.GuiTextures; +import com.klikli_dev.theurgy.content.recipe.IncubationRecipe; +import com.klikli_dev.theurgy.integration.jei.JeiDrawables; +import com.klikli_dev.theurgy.integration.jei.JeiRecipeTypes; +import com.klikli_dev.theurgy.registry.BlockRegistry; +import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; +import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; +import mezz.jei.api.gui.drawable.IDrawable; +import mezz.jei.api.gui.drawable.IDrawableAnimated; +import mezz.jei.api.gui.ingredient.IRecipeSlotsView; +import mezz.jei.api.helpers.IGuiHelper; +import mezz.jei.api.recipe.IFocusGroup; +import mezz.jei.api.recipe.RecipeType; +import mezz.jei.api.recipe.category.IRecipeCategory; +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.item.ItemStack; + +import java.util.Arrays; +import java.util.stream.Collectors; + +import static mezz.jei.api.recipe.RecipeIngredientRole.INPUT; +import static mezz.jei.api.recipe.RecipeIngredientRole.OUTPUT; + +public class IncubationCategory implements IRecipeCategory { + private final IDrawableAnimated animatedFire; + private final IDrawable background; + private final IDrawable icon; + private final Component localizedName; + private final LoadingCache cachedAnimatedArrow; + + public IncubationCategory(IGuiHelper guiHelper) { + this.background = guiHelper.createBlankDrawable(82, 60); + + this.animatedFire = JeiDrawables.asAnimatedDrawable(guiHelper, GuiTextures.JEI_FIRE_FULL, 300, IDrawableAnimated.StartDirection.TOP, true); + + this.icon = guiHelper.createDrawableItemStack(new ItemStack(BlockRegistry.INCUBATOR.get())); + this.localizedName = Component.translatable(TheurgyConstants.I18n.JEI.INCUBATION_CATEGORY); + + //We need different animations for different cook times, hence the cache + this.cachedAnimatedArrow = CacheBuilder.newBuilder() + .maximumSize(25) + .build(new CacheLoader<>() { + @Override + public IDrawableAnimated load(Integer cookTime) { + return JeiDrawables.asAnimatedDrawable(guiHelper, GuiTextures.JEI_ARROW_RIGHT_FULL, cookTime, IDrawableAnimated.StartDirection.LEFT, false); + } + }); + } + + protected IDrawableAnimated getAnimatedArrow(IncubationRecipe recipe) { + int cookTime = recipe.getIncubationTime(); + if (cookTime <= 0) { + cookTime = IncubationRecipe.DEFAULT_INCUBATION_TIME; + } + return this.cachedAnimatedArrow.getUnchecked(cookTime); + } + + @Override + public IDrawable getBackground() { + return this.background; + } + + @Override + public IDrawable getIcon() { + return this.icon; + } + + @Override + public void draw(IncubationRecipe recipe, IRecipeSlotsView recipeSlotsView, GuiGraphics guiGraphics, double mouseX, double mouseY) { + GuiTextures.JEI_FIRE_EMPTY.render(guiGraphics, 28, 44); + this.animatedFire.draw(guiGraphics, 28, 44); + + GuiTextures.JEI_ARROW_RIGHT_EMPTY.render(guiGraphics, 24, 22); + this.getAnimatedArrow(recipe).draw(guiGraphics, 24, 22); + + this.drawCookTime(recipe, guiGraphics, 47); + } + + protected void drawCookTime(IncubationRecipe recipe, GuiGraphics guiGraphics, int y) { + int cookTime = recipe.getIncubationTime(); + if (cookTime > 0) { + int cookTimeSeconds = cookTime / 20; + Component timeString = Component.translatable("gui.jei.category.smelting.time.seconds", cookTimeSeconds); + Minecraft minecraft = Minecraft.getInstance(); + Font font = minecraft.font; + int stringWidth = font.width(timeString); + guiGraphics.drawString(font, timeString, this.background.getWidth() - stringWidth, y, 0xFF808080, false); + } + } + + @Override + public Component getTitle() { + return this.localizedName; + } + + + @Override + public void setRecipe(IRecipeLayoutBuilder builder, IncubationRecipe recipe, IFocusGroup focuses) { + builder.addSlot(INPUT, 1, 1) + .setBackground(JeiDrawables.INPUT_SLOT, -1, -1) + .addIngredients(recipe.getMercury()); + + //sulfurs in the recipe are in most cases specified only via the item id (as one sulfur = one item), but for rendering we need the nbt, so we get it from the corresponding recipe. + var recipeManager = Minecraft.getInstance().level.getRecipeManager(); + var liquefactionRecipes = recipeManager.getAllRecipesFor(RecipeTypeRegistry.LIQUEFACTION.get()).stream().filter(r -> r.getResultItem(Minecraft.getInstance().level.registryAccess()) != null).collect(Collectors.toList()); + + var sulfurIngredients = Arrays.stream(recipe.getSulfur().getItems()).map(sulfur -> { + if (sulfur.hasTag()) + return sulfur; + + var sulfurItem = sulfur.getItem(); + var sulfurWithNbt = liquefactionRecipes.stream() + .filter(r -> r.getResultItem(Minecraft.getInstance().level.registryAccess()).getItem() == sulfurItem).map(r -> r.getResultItem(Minecraft.getInstance().level.registryAccess())).findFirst(); + + if (sulfurWithNbt.isPresent()) { + sulfur = sulfur.copy(); + sulfur.setTag(sulfurWithNbt.get().getTag()); + } + + return sulfur; + }).toList(); + + builder.addSlot(INPUT, 1, 21) + .setBackground(JeiDrawables.INPUT_SLOT, -1, -1) + .addItemStacks(sulfurIngredients); + + builder.addSlot(INPUT, 1, 42) + .setBackground(JeiDrawables.INPUT_SLOT, -1, -1) + .addIngredients(recipe.getSalt()); + + builder.addSlot(OUTPUT, 61, 22) + .setBackground(JeiDrawables.OUTPUT_SLOT, -5, -5) + .addItemStacks(Arrays.asList(recipe.getResult().getStacks())); + } + + @Override + public RecipeType getRecipeType() { + return JeiRecipeTypes.INCUBATION; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/integration/jei/recipes/LiquefactionCategory.java b/src/main/java/com/klikli_dev/theurgy/integration/jei/recipes/LiquefactionCategory.java new file mode 100644 index 000000000..fd5912b6b --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/integration/jei/recipes/LiquefactionCategory.java @@ -0,0 +1,156 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.integration.jei.recipes; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.klikli_dev.theurgy.TheurgyConstants; +import com.klikli_dev.theurgy.content.gui.GuiTextures; +import com.klikli_dev.theurgy.content.recipe.LiquefactionRecipe; +import com.klikli_dev.theurgy.integration.jei.JeiDrawables; +import com.klikli_dev.theurgy.integration.jei.JeiRecipeTypes; +import com.klikli_dev.theurgy.registry.BlockRegistry; +import mezz.jei.api.forge.ForgeTypes; +import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; +import mezz.jei.api.gui.drawable.IDrawable; +import mezz.jei.api.gui.drawable.IDrawableAnimated; +import mezz.jei.api.gui.ingredient.IRecipeSlotTooltipCallback; +import mezz.jei.api.gui.ingredient.IRecipeSlotsView; +import mezz.jei.api.helpers.IGuiHelper; +import mezz.jei.api.recipe.IFocusGroup; +import mezz.jei.api.recipe.RecipeType; +import mezz.jei.api.recipe.category.IRecipeCategory; +import net.minecraft.ChatFormatting; +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.item.ItemStack; + +import java.util.Arrays; +import java.util.List; + +import static mezz.jei.api.recipe.RecipeIngredientRole.INPUT; +import static mezz.jei.api.recipe.RecipeIngredientRole.OUTPUT; + +public class LiquefactionCategory implements IRecipeCategory { + private final IDrawableAnimated animatedFire; + private final IDrawable background; + private final IDrawable icon; + private final Component localizedName; + private final LoadingCache cachedAnimatedArrow; + + public LiquefactionCategory(IGuiHelper guiHelper) { + this.background = guiHelper.createBlankDrawable(102, 43); + + this.animatedFire = JeiDrawables.asAnimatedDrawable(guiHelper, GuiTextures.JEI_FIRE_FULL, 300, IDrawableAnimated.StartDirection.TOP, true); + + this.icon = guiHelper.createDrawableItemStack(new ItemStack(BlockRegistry.LIQUEFACTION_CAULDRON.get())); + this.localizedName = Component.translatable(TheurgyConstants.I18n.JEI.LIQUEFACTION_CATEGORY); + + //We need different animations for different cook times, hence the cache + this.cachedAnimatedArrow = CacheBuilder.newBuilder() + .maximumSize(25) + .build(new CacheLoader<>() { + @Override + public IDrawableAnimated load(Integer cookTime) { + return JeiDrawables.asAnimatedDrawable(guiHelper, GuiTextures.JEI_ARROW_RIGHT_FULL, cookTime, IDrawableAnimated.StartDirection.LEFT, false); + } + }); + } + + public static IRecipeSlotTooltipCallback addFluidTooltip(int overrideAmount) { + return (view, tooltip) -> { + var displayed = view.getDisplayedIngredient(ForgeTypes.FLUID_STACK); + if (displayed.isEmpty()) + return; + + var fluidStack = displayed.get(); + + var amount = overrideAmount == -1 ? fluidStack.getAmount() : overrideAmount; + var text = Component.translatable(TheurgyConstants.I18n.Misc.UNIT_MILLIBUCKETS, amount).withStyle(ChatFormatting.GOLD); + if (tooltip.isEmpty()) + tooltip.add(0, text); + else { + List siblings = tooltip.get(0).getSiblings(); + siblings.add(Component.literal(" ")); + siblings.add(text); + } + }; + } + + protected IDrawableAnimated getAnimatedArrow(LiquefactionRecipe recipe) { + int cookTime = recipe.getLiquefactionTime(); + if (cookTime <= 0) { + cookTime = LiquefactionRecipe.DEFAULT_LIQUEFACTION_TIME; + } + return this.cachedAnimatedArrow.getUnchecked(cookTime); + } + + @Override + public IDrawable getBackground() { + return this.background; + } + + @Override + public IDrawable getIcon() { + return this.icon; + } + + @Override + public void draw(LiquefactionRecipe recipe, IRecipeSlotsView recipeSlotsView, GuiGraphics guiGraphics, double mouseX, double mouseY) { + GuiTextures.JEI_FIRE_EMPTY.render(guiGraphics, 12, 20); + this.animatedFire.draw(guiGraphics, 12, 20); + + GuiTextures.JEI_ARROW_RIGHT_EMPTY.render(guiGraphics, 45, 8); + this.getAnimatedArrow(recipe).draw(guiGraphics, 45, 8); + + this.drawCookTime(recipe, guiGraphics, 34); + } + + protected void drawCookTime(LiquefactionRecipe recipe, GuiGraphics guiGraphics, int y) { + int cookTime = recipe.getLiquefactionTime(); + if (cookTime > 0) { + int cookTimeSeconds = cookTime / 20; + Component timeString = Component.translatable("gui.jei.category.smelting.time.seconds", cookTimeSeconds); + Minecraft minecraft = Minecraft.getInstance(); + Font font = minecraft.font; + int stringWidth = font.width(timeString); + guiGraphics.drawString(font, timeString, this.background.getWidth() - stringWidth, y, 0xFF808080, false); + } + } + + @Override + public Component getTitle() { + return this.localizedName; + } + + @Override + public void setRecipe(IRecipeLayoutBuilder builder, LiquefactionRecipe recipe, IFocusGroup focuses) { + builder.addSlot(INPUT, 1, 1) + .setBackground(JeiDrawables.INPUT_SLOT, -1, -1) + .addIngredients(ForgeTypes.FLUID_STACK, List.of(recipe.getSolvent().getFluids())) + .addTooltipCallback(addFluidTooltip(recipe.getSolvent().getAmount())); + + builder.addSlot(INPUT, 19, 1) + .setBackground(JeiDrawables.INPUT_SLOT, -1, -1) + .addIngredients(recipe.getIngredients().get(0)); + builder.addSlot(OUTPUT, 81, 9) + .setBackground(JeiDrawables.OUTPUT_SLOT, -5, -5) + .addItemStack(recipe.getResultItem(Minecraft.getInstance().level.registryAccess())); + + //now add the bucket to the recipe lookup for the output fluid + builder.addInvisibleIngredients(INPUT).addItemStacks(Arrays.stream(recipe.getSolvent().getFluids()).map(f -> new ItemStack(f.getFluid().getBucket())).toList()); + } + + @Override + public RecipeType getRecipeType() { + return JeiRecipeTypes.LIQUEFACTION; + } + +} diff --git a/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/PageLoaders.java b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/PageLoaders.java new file mode 100644 index 000000000..f88809669 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/PageLoaders.java @@ -0,0 +1,26 @@ +// SPDX-FileCopyrightText: 2023 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.integration.modonomicon; + +import com.klikli_dev.modonomicon.data.LoaderRegistry; +import com.klikli_dev.theurgy.integration.modonomicon.page.accumulation.BookAccumulationRecipePage; +import com.klikli_dev.theurgy.integration.modonomicon.page.calcination.BookCalcinationRecipePage; +import com.klikli_dev.theurgy.integration.modonomicon.page.distillation.BookDistillationRecipePage; +import com.klikli_dev.theurgy.integration.modonomicon.page.incubation.BookIncubationRecipePage; +import com.klikli_dev.theurgy.integration.modonomicon.page.liquefaction.BookLiquefactionRecipePage; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; + +public class PageLoaders { + + public static void onCommonSetup(final FMLCommonSetupEvent event) { + LoaderRegistry.registerPageLoader(TheurgyModonomiconConstants.Page.ACCUMULATION_RECIPE, BookAccumulationRecipePage::fromJson, BookAccumulationRecipePage::fromNetwork); + LoaderRegistry.registerPageLoader(TheurgyModonomiconConstants.Page.CALCINATION_RECIPE, BookCalcinationRecipePage::fromJson, BookCalcinationRecipePage::fromNetwork); + LoaderRegistry.registerPageLoader(TheurgyModonomiconConstants.Page.DISTILLATION_RECIPE, BookDistillationRecipePage::fromJson, BookDistillationRecipePage::fromNetwork); + LoaderRegistry.registerPageLoader(TheurgyModonomiconConstants.Page.INCUBATION_RECIPE, BookIncubationRecipePage::fromJson, BookIncubationRecipePage::fromNetwork); + LoaderRegistry.registerPageLoader(TheurgyModonomiconConstants.Page.LIQUEFACTION_RECIPE, BookLiquefactionRecipePage::fromJson, BookLiquefactionRecipePage::fromNetwork); + } + + +} diff --git a/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/PageRenderers.java b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/PageRenderers.java new file mode 100644 index 000000000..144d683f6 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/PageRenderers.java @@ -0,0 +1,44 @@ +// SPDX-FileCopyrightText: 2023 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.integration.modonomicon; + +import com.klikli_dev.modonomicon.client.render.page.PageRendererRegistry; +import com.klikli_dev.theurgy.integration.modonomicon.page.accumulation.BookAccumulationRecipePage; +import com.klikli_dev.theurgy.integration.modonomicon.page.accumulation.BookAccumulationRecipePageRenderer; +import com.klikli_dev.theurgy.integration.modonomicon.page.calcination.BookCalcinationRecipePage; +import com.klikli_dev.theurgy.integration.modonomicon.page.calcination.BookCalcinationRecipePageRenderer; +import com.klikli_dev.theurgy.integration.modonomicon.page.distillation.BookDistillationRecipePage; +import com.klikli_dev.theurgy.integration.modonomicon.page.distillation.BookDistillationRecipePageRenderer; +import com.klikli_dev.theurgy.integration.modonomicon.page.incubation.BookIncubationRecipePage; +import com.klikli_dev.theurgy.integration.modonomicon.page.incubation.BookIncubationRecipePageRenderer; +import com.klikli_dev.theurgy.integration.modonomicon.page.liquefaction.BookLiquefactionRecipePage; +import com.klikli_dev.theurgy.integration.modonomicon.page.liquefaction.BookLiquefactionRecipePageRenderer; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; + +public class PageRenderers { + + public static void onClientSetup(FMLClientSetupEvent event) { + PageRendererRegistry.registerPageRenderer( + TheurgyModonomiconConstants.Page.ACCUMULATION_RECIPE, + p -> new BookAccumulationRecipePageRenderer((BookAccumulationRecipePage) p)); + + PageRendererRegistry.registerPageRenderer( + TheurgyModonomiconConstants.Page.CALCINATION_RECIPE, + p -> new BookCalcinationRecipePageRenderer((BookCalcinationRecipePage) p)); + + PageRendererRegistry.registerPageRenderer( + TheurgyModonomiconConstants.Page.DISTILLATION_RECIPE, + p -> new BookDistillationRecipePageRenderer((BookDistillationRecipePage) p)); + + PageRendererRegistry.registerPageRenderer( + TheurgyModonomiconConstants.Page.INCUBATION_RECIPE, + p -> new BookIncubationRecipePageRenderer((BookIncubationRecipePage) p)); + + PageRendererRegistry.registerPageRenderer( + TheurgyModonomiconConstants.Page.LIQUEFACTION_RECIPE, + p -> new BookLiquefactionRecipePageRenderer((BookLiquefactionRecipePage) p)); + } + +} diff --git a/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/TheurgyModonomiconConstants.java b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/TheurgyModonomiconConstants.java new file mode 100644 index 000000000..6b42ca702 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/TheurgyModonomiconConstants.java @@ -0,0 +1,18 @@ +// SPDX-FileCopyrightText: 2023 klikli-dev +// +// SPDX-License-Identifier: MIT + +package com.klikli_dev.theurgy.integration.modonomicon; + +import com.klikli_dev.theurgy.Theurgy; +import net.minecraft.resources.ResourceLocation; + +public class TheurgyModonomiconConstants { + public static class Page { + public static final ResourceLocation ACCUMULATION_RECIPE = Theurgy.loc("accumulation_recipe"); + public static final ResourceLocation CALCINATION_RECIPE = Theurgy.loc("calcination_recipe"); + public static final ResourceLocation DISTILLATION_RECIPE = Theurgy.loc("distillation_recipe"); + public static final ResourceLocation INCUBATION_RECIPE = Theurgy.loc("incubation_recipe"); + public static final ResourceLocation LIQUEFACTION_RECIPE = Theurgy.loc("liquefaction_recipe"); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/accumulation/BookAccumulationRecipePage.java b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/accumulation/BookAccumulationRecipePage.java new file mode 100644 index 000000000..bfc312f98 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/accumulation/BookAccumulationRecipePage.java @@ -0,0 +1,97 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.integration.modonomicon.page.accumulation; + +import com.google.gson.JsonObject; +import com.klikli_dev.modonomicon.book.BookEntry; +import com.klikli_dev.modonomicon.book.BookTextHolder; +import com.klikli_dev.modonomicon.book.page.BookRecipePage; +import com.klikli_dev.theurgy.content.recipe.AccumulationRecipe; +import com.klikli_dev.theurgy.integration.modonomicon.TheurgyModonomiconConstants; +import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +public class BookAccumulationRecipePage extends BookRecipePage { + public BookAccumulationRecipePage(BookTextHolder title1, ResourceLocation recipeId1, BookTextHolder title2, ResourceLocation recipeId2, BookTextHolder text, String anchor) { + super(RecipeTypeRegistry.ACCUMULATION.get(), title1, recipeId1, title2, recipeId2, text, anchor); + } + + public static BookAccumulationRecipePage fromJson(JsonObject json) { + var common = BookRecipePage.commonFromJson(json); + var anchor = GsonHelper.getAsString(json, "anchor", ""); + return new BookAccumulationRecipePage(common.title1(), common.recipeId1(), common.title2(), common.recipeId2(), common.text(), anchor); + } + + public static BookAccumulationRecipePage fromNetwork(FriendlyByteBuf buffer) { + var common = BookRecipePage.commonFromNetwork(buffer); + var anchor = buffer.readUtf(); + return new BookAccumulationRecipePage(common.title1(), common.recipeId1(), common.title2(), common.recipeId2(), common.text(), anchor); + } + + @Override + public ResourceLocation getType() { + return TheurgyModonomiconConstants.Page.ACCUMULATION_RECIPE; + } + + @Override + public void build(Level level, BookEntry parentEntry, int pageNum) { + //copy from parents parent as we won't be calling super. + this.parentEntry = parentEntry; + this.pageNumber = pageNum; + this.book = this.parentEntry.getBook(); + + //copy from parent so we can use the fluid name as title, instead of the non existent recipe output. + + this.recipe1 = this.loadRecipe(level, parentEntry, this.recipeId1); + this.recipe2 = this.loadRecipe(level, parentEntry, this.recipeId2); + + if (this.recipe1 == null && this.recipe2 != null) { + this.recipe1 = this.recipe2; + this.recipe2 = null; + } + + if (this.title1.isEmpty()) { + //use recipe title if we don't have a custom one + this.title1 = new BookTextHolder(((MutableComponent) + this.recipe1.getResult().getDisplayName()) + .withStyle(Style.EMPTY + .withBold(true) + .withColor(this.getParentEntry().getBook().getDefaultTitleColor()) + )); + } + + if (this.recipe2 != null && this.title2.isEmpty()) { + //use recipe title if we don't have a custom one + this.title2 = new BookTextHolder(((MutableComponent) this.recipe2.getResult().getDisplayName()) + .withStyle(Style.EMPTY + .withBold(true) + .withColor(this.getParentEntry().getBook().getDefaultTitleColor()) + )); + } + + if (this.title1.equals(this.title2)) { + this.title2 = BookTextHolder.EMPTY; + } + } + + @Override + protected ItemStack getRecipeOutput(Level level, AccumulationRecipe recipe) { + return ItemStack.EMPTY; + } + + @Override + public void toNetwork(FriendlyByteBuf buffer) { + super.toNetwork(buffer); + buffer.writeUtf(this.anchor); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/accumulation/BookAccumulationRecipePageModel.java b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/accumulation/BookAccumulationRecipePageModel.java new file mode 100644 index 000000000..5e14c4ee6 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/accumulation/BookAccumulationRecipePageModel.java @@ -0,0 +1,42 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.integration.modonomicon.page.accumulation; + +import com.klikli_dev.modonomicon.api.datagen.book.page.BookRecipePageModel; +import com.klikli_dev.theurgy.integration.modonomicon.TheurgyModonomiconConstants; +import org.jetbrains.annotations.NotNull; + +public class BookAccumulationRecipePageModel extends BookRecipePageModel { + protected BookAccumulationRecipePageModel(@NotNull String anchor) { + super(TheurgyModonomiconConstants.Page.ACCUMULATION_RECIPE, anchor); + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder extends BookRecipePageModel.Builder { + protected Builder() { + super(); + } + + public BookAccumulationRecipePageModel build() { + var model = new BookAccumulationRecipePageModel(this.anchor); + model.title1 = this.title1; + model.recipeId1 = this.recipeId1; + model.title2 = this.title2; + model.recipeId2 = this.recipeId2; + model.text = this.text; + return model; + } + + @Override + public Builder getThis() { + return this; + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/accumulation/BookAccumulationRecipePageRenderer.java b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/accumulation/BookAccumulationRecipePageRenderer.java new file mode 100644 index 000000000..20b41f894 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/accumulation/BookAccumulationRecipePageRenderer.java @@ -0,0 +1,60 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.integration.modonomicon.page.accumulation; + +import com.klikli_dev.modonomicon.book.page.BookRecipePage; +import com.klikli_dev.modonomicon.client.gui.book.BookContentScreen; +import com.klikli_dev.modonomicon.client.render.page.BookRecipePageRenderer; +import com.klikli_dev.modonomicon.fluid.FluidHolder; +import com.klikli_dev.modonomicon.fluid.ForgeFluidHolder; +import com.klikli_dev.theurgy.content.gui.GuiTextures; +import com.klikli_dev.theurgy.content.recipe.AccumulationRecipe; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraftforge.fluids.FluidType; + +import java.util.Arrays; + +public class BookAccumulationRecipePageRenderer extends BookRecipePageRenderer> { + public BookAccumulationRecipePageRenderer(BookAccumulationRecipePage page) { + super(page); + } + + @Override + protected int getRecipeHeight() { + return 60; + } + + @Override + protected void drawRecipe(GuiGraphics guiGraphics, AccumulationRecipe recipe, int recipeX, int recipeY, int mouseX, int mouseY, boolean second) { + recipeY += 10; + + if (!second) { + if (!this.page.getTitle1().isEmpty()) { + this.renderTitle(guiGraphics, this.page.getTitle1(), false, BookContentScreen.PAGE_WIDTH / 2, 0); + } + } else { + if (!this.page.getTitle2().isEmpty()) { + this.renderTitle(guiGraphics, this.page.getTitle2(), false, BookContentScreen.PAGE_WIDTH / 2, + recipeY - (this.page.getTitle2().getString().isEmpty() ? 10 : 0) - 10); + } + } + + GuiTextures.MODONOMICON_SLOT.render(guiGraphics, recipeX, recipeY); //render the fluid input slot + this.parentScreen.renderFluidStacks(guiGraphics, recipeX + 2, recipeY + 2, mouseX, mouseY, Arrays.stream(recipe.getEvaporant().getFluids()).map(f -> (FluidHolder) new ForgeFluidHolder(f)).toList(), FluidType.BUCKET_VOLUME); + + if (recipe.hasSolute()) { + GuiTextures.MODONOMICON_SLOT.render(guiGraphics, recipeX, recipeY + 24); //render the item input slot + this.parentScreen.renderIngredient(guiGraphics, recipeX + 3, recipeY + 24 + 3, mouseX, mouseY, recipe.getSolute()); + } + + GuiTextures.MODONOMICON_SLOT.render(guiGraphics, recipeX + 61, recipeY); //render the fluid output slot + this.parentScreen.renderFluidStack(guiGraphics, recipeX + 61 + 2, recipeY + 2, mouseX, mouseY, new ForgeFluidHolder(recipe.getResult()), FluidType.BUCKET_VOLUME); + + GuiTextures.MODONOMICON_ARROW_RIGHT.render(guiGraphics, recipeX + 40, recipeY + 7); //render the arrow + this.parentScreen.renderItemStack(guiGraphics, recipeX + 36, recipeY + 20, mouseX, mouseY, recipe.getToastSymbol()); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/calcination/BookCalcinationRecipePage.java b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/calcination/BookCalcinationRecipePage.java new file mode 100644 index 000000000..edce862b3 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/calcination/BookCalcinationRecipePage.java @@ -0,0 +1,48 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.integration.modonomicon.page.calcination; + +import com.google.gson.JsonObject; +import com.klikli_dev.modonomicon.book.BookTextHolder; +import com.klikli_dev.modonomicon.book.page.BookProcessingRecipePage; +import com.klikli_dev.modonomicon.book.page.BookRecipePage; +import com.klikli_dev.theurgy.content.recipe.CalcinationRecipe; +import com.klikli_dev.theurgy.integration.modonomicon.TheurgyModonomiconConstants; +import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; + +public class BookCalcinationRecipePage extends BookProcessingRecipePage { + public BookCalcinationRecipePage(BookTextHolder title1, ResourceLocation recipeId1, BookTextHolder title2, ResourceLocation recipeId2, BookTextHolder text, String anchor) { + super(RecipeTypeRegistry.CALCINATION.get(), title1, recipeId1, title2, recipeId2, text, anchor); + } + + public static BookCalcinationRecipePage fromJson(JsonObject json) { + var common = BookRecipePage.commonFromJson(json); + var anchor = GsonHelper.getAsString(json, "anchor", ""); + return new BookCalcinationRecipePage(common.title1(), common.recipeId1(), common.title2(), common.recipeId2(), common.text(), anchor); + } + + public static BookCalcinationRecipePage fromNetwork(FriendlyByteBuf buffer) { + var common = BookRecipePage.commonFromNetwork(buffer); + var anchor = buffer.readUtf(); + return new BookCalcinationRecipePage(common.title1(), common.recipeId1(), common.title2(), common.recipeId2(), common.text(), anchor); + } + + @Override + public ResourceLocation getType() { + return TheurgyModonomiconConstants.Page.CALCINATION_RECIPE; + } + + + @Override + public void toNetwork(FriendlyByteBuf buffer) { + super.toNetwork(buffer); + buffer.writeUtf(this.anchor); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/calcination/BookCalcinationRecipePageModel.java b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/calcination/BookCalcinationRecipePageModel.java new file mode 100644 index 000000000..535884986 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/calcination/BookCalcinationRecipePageModel.java @@ -0,0 +1,42 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.integration.modonomicon.page.calcination; + +import com.klikli_dev.modonomicon.api.datagen.book.page.BookRecipePageModel; +import com.klikli_dev.theurgy.integration.modonomicon.TheurgyModonomiconConstants; +import org.jetbrains.annotations.NotNull; + +public class BookCalcinationRecipePageModel extends BookRecipePageModel { + protected BookCalcinationRecipePageModel(@NotNull String anchor) { + super(TheurgyModonomiconConstants.Page.CALCINATION_RECIPE, anchor); + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder extends BookRecipePageModel.Builder { + protected Builder() { + super(); + } + + public BookCalcinationRecipePageModel build() { + var model = new BookCalcinationRecipePageModel(this.anchor); + model.title1 = this.title1; + model.recipeId1 = this.recipeId1; + model.title2 = this.title2; + model.recipeId2 = this.recipeId2; + model.text = this.text; + return model; + } + + @Override + public Builder getThis() { + return this; + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/calcination/BookCalcinationRecipePageRenderer.java b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/calcination/BookCalcinationRecipePageRenderer.java new file mode 100644 index 000000000..826802af5 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/calcination/BookCalcinationRecipePageRenderer.java @@ -0,0 +1,49 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.integration.modonomicon.page.calcination; + +import com.klikli_dev.modonomicon.client.gui.book.BookContentScreen; +import com.klikli_dev.modonomicon.client.render.page.BookRecipePageRenderer; +import com.klikli_dev.theurgy.content.gui.GuiTextures; +import com.klikli_dev.theurgy.content.recipe.CalcinationRecipe; +import net.minecraft.client.gui.GuiGraphics; + +public class BookCalcinationRecipePageRenderer extends BookRecipePageRenderer { + public BookCalcinationRecipePageRenderer(BookCalcinationRecipePage page) { + super(page); + } + + @Override + protected int getRecipeHeight() { + return 60; + } + + @Override + protected void drawRecipe(GuiGraphics guiGraphics, CalcinationRecipe recipe, int recipeX, int recipeY, int mouseX, int mouseY, boolean second) { + recipeY += 10; + + if (!second) { + if (!this.page.getTitle1().isEmpty()) { + this.renderTitle(guiGraphics, this.page.getTitle1(), false, BookContentScreen.PAGE_WIDTH / 2, 0); + } + } else { + if (!this.page.getTitle2().isEmpty()) { + this.renderTitle(guiGraphics, this.page.getTitle2(), false, BookContentScreen.PAGE_WIDTH / 2, + recipeY - (this.page.getTitle2().getString().isEmpty() ? 10 : 0) - 10); + } + } + + GuiTextures.MODONOMICON_SLOT.render(guiGraphics, recipeX, recipeY); //render the input slot + this.parentScreen.renderIngredient(guiGraphics, recipeX + 3, recipeY + 3, mouseX, mouseY, recipe.getIngredients().get(0), recipe.getIngredientCount()); + + GuiTextures.MODONOMICON_SLOT.render(guiGraphics, recipeX + 61, recipeY); //render the output slot + this.parentScreen.renderItemStack(guiGraphics, recipeX + 61 + 3, recipeY + 3, mouseX, mouseY, recipe.getResultItem(this.parentScreen.getMinecraft().level.registryAccess())); + + GuiTextures.MODONOMICON_ARROW_RIGHT.render(guiGraphics, recipeX + 40, recipeY + 7); //render the arrow + this.parentScreen.renderItemStack(guiGraphics, recipeX + 36, recipeY + 20, mouseX, mouseY, recipe.getToastSymbol()); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/distillation/BookDistillationRecipePage.java b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/distillation/BookDistillationRecipePage.java new file mode 100644 index 000000000..b21814910 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/distillation/BookDistillationRecipePage.java @@ -0,0 +1,47 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.integration.modonomicon.page.distillation; + +import com.google.gson.JsonObject; +import com.klikli_dev.modonomicon.book.BookTextHolder; +import com.klikli_dev.modonomicon.book.page.BookProcessingRecipePage; +import com.klikli_dev.modonomicon.book.page.BookRecipePage; +import com.klikli_dev.theurgy.content.recipe.DistillationRecipe; +import com.klikli_dev.theurgy.integration.modonomicon.TheurgyModonomiconConstants; +import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; + +public class BookDistillationRecipePage extends BookProcessingRecipePage { + public BookDistillationRecipePage(BookTextHolder title1, ResourceLocation recipeId1, BookTextHolder title2, ResourceLocation recipeId2, BookTextHolder text, String anchor) { + super(RecipeTypeRegistry.DISTILLATION.get(), title1, recipeId1, title2, recipeId2, text, anchor); + } + + public static BookDistillationRecipePage fromJson(JsonObject json) { + var common = BookRecipePage.commonFromJson(json); + var anchor = GsonHelper.getAsString(json, "anchor", ""); + return new BookDistillationRecipePage(common.title1(), common.recipeId1(), common.title2(), common.recipeId2(), common.text(), anchor); + } + + public static BookDistillationRecipePage fromNetwork(FriendlyByteBuf buffer) { + var common = BookRecipePage.commonFromNetwork(buffer); + var anchor = buffer.readUtf(); + return new BookDistillationRecipePage(common.title1(), common.recipeId1(), common.title2(), common.recipeId2(), common.text(), anchor); + } + + @Override + public ResourceLocation getType() { + return TheurgyModonomiconConstants.Page.DISTILLATION_RECIPE; + } + + @Override + public void toNetwork(FriendlyByteBuf buffer) { + super.toNetwork(buffer); + buffer.writeUtf(this.anchor); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/distillation/BookDistillationRecipePageModel.java b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/distillation/BookDistillationRecipePageModel.java new file mode 100644 index 000000000..11f448545 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/distillation/BookDistillationRecipePageModel.java @@ -0,0 +1,42 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.integration.modonomicon.page.distillation; + +import com.klikli_dev.modonomicon.api.datagen.book.page.BookRecipePageModel; +import com.klikli_dev.theurgy.integration.modonomicon.TheurgyModonomiconConstants; +import org.jetbrains.annotations.NotNull; + +public class BookDistillationRecipePageModel extends BookRecipePageModel { + protected BookDistillationRecipePageModel(@NotNull String anchor) { + super(TheurgyModonomiconConstants.Page.DISTILLATION_RECIPE, anchor); + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder extends BookRecipePageModel.Builder { + protected Builder() { + super(); + } + + public BookDistillationRecipePageModel build() { + var model = new BookDistillationRecipePageModel(this.anchor); + model.title1 = this.title1; + model.recipeId1 = this.recipeId1; + model.title2 = this.title2; + model.recipeId2 = this.recipeId2; + model.text = this.text; + return model; + } + + @Override + public Builder getThis() { + return this; + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/distillation/BookDistillationRecipePageRenderer.java b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/distillation/BookDistillationRecipePageRenderer.java new file mode 100644 index 000000000..af8027d20 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/distillation/BookDistillationRecipePageRenderer.java @@ -0,0 +1,49 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.integration.modonomicon.page.distillation; + +import com.klikli_dev.modonomicon.client.gui.book.BookContentScreen; +import com.klikli_dev.modonomicon.client.render.page.BookRecipePageRenderer; +import com.klikli_dev.theurgy.content.gui.GuiTextures; +import com.klikli_dev.theurgy.content.recipe.DistillationRecipe; +import net.minecraft.client.gui.GuiGraphics; + +public class BookDistillationRecipePageRenderer extends BookRecipePageRenderer { + public BookDistillationRecipePageRenderer(BookDistillationRecipePage page) { + super(page); + } + + @Override + protected int getRecipeHeight() { + return 60; + } + + @Override + protected void drawRecipe(GuiGraphics guiGraphics, DistillationRecipe recipe, int recipeX, int recipeY, int mouseX, int mouseY, boolean second) { + recipeY += 10; + + if (!second) { + if (!this.page.getTitle1().isEmpty()) { + this.renderTitle(guiGraphics, this.page.getTitle1(), false, BookContentScreen.PAGE_WIDTH / 2, 0); + } + } else { + if (!this.page.getTitle2().isEmpty()) { + this.renderTitle(guiGraphics, this.page.getTitle2(), false, BookContentScreen.PAGE_WIDTH / 2, + recipeY - (this.page.getTitle2().getString().isEmpty() ? 10 : 0) - 10); + } + } + + GuiTextures.MODONOMICON_SLOT.render(guiGraphics, recipeX, recipeY); //render the input slot + this.parentScreen.renderIngredient(guiGraphics, recipeX + 3, recipeY + 3, mouseX, mouseY, recipe.getIngredients().get(0), recipe.getIngredientCount()); + + GuiTextures.MODONOMICON_SLOT.render(guiGraphics, recipeX + 61, recipeY); //render the output slot + this.parentScreen.renderItemStack(guiGraphics, recipeX + 61 + 3, recipeY + 3, mouseX, mouseY, recipe.getResultItem(this.parentScreen.getMinecraft().level.registryAccess())); + + GuiTextures.MODONOMICON_ARROW_RIGHT.render(guiGraphics, recipeX + 40, recipeY + 7); //render the arrow + this.parentScreen.renderItemStack(guiGraphics, recipeX + 36, recipeY + 20, mouseX, mouseY, recipe.getToastSymbol()); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/incubation/BookIncubationRecipePage.java b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/incubation/BookIncubationRecipePage.java new file mode 100644 index 000000000..8d788bf88 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/incubation/BookIncubationRecipePage.java @@ -0,0 +1,48 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.integration.modonomicon.page.incubation; + +import com.google.gson.JsonObject; +import com.klikli_dev.modonomicon.book.BookTextHolder; +import com.klikli_dev.modonomicon.book.page.BookProcessingRecipePage; +import com.klikli_dev.modonomicon.book.page.BookRecipePage; +import com.klikli_dev.theurgy.content.recipe.IncubationRecipe; +import com.klikli_dev.theurgy.integration.modonomicon.TheurgyModonomiconConstants; +import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; + +public class BookIncubationRecipePage extends BookProcessingRecipePage { + public BookIncubationRecipePage(BookTextHolder title1, ResourceLocation recipeId1, BookTextHolder title2, ResourceLocation recipeId2, BookTextHolder text, String anchor) { + super(RecipeTypeRegistry.INCUBATION.get(), title1, recipeId1, title2, recipeId2, text, anchor); + } + + public static BookIncubationRecipePage fromJson(JsonObject json) { + var common = BookRecipePage.commonFromJson(json); + var anchor = GsonHelper.getAsString(json, "anchor", ""); + return new BookIncubationRecipePage(common.title1(), common.recipeId1(), common.title2(), common.recipeId2(), common.text(), anchor); + } + + public static BookIncubationRecipePage fromNetwork(FriendlyByteBuf buffer) { + var common = BookRecipePage.commonFromNetwork(buffer); + var anchor = buffer.readUtf(); + return new BookIncubationRecipePage(common.title1(), common.recipeId1(), common.title2(), common.recipeId2(), common.text(), anchor); + } + + @Override + public ResourceLocation getType() { + return TheurgyModonomiconConstants.Page.INCUBATION_RECIPE; + } + + + @Override + public void toNetwork(FriendlyByteBuf buffer) { + super.toNetwork(buffer); + buffer.writeUtf(this.anchor); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/incubation/BookIncubationRecipePageModel.java b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/incubation/BookIncubationRecipePageModel.java new file mode 100644 index 000000000..15e52f03c --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/incubation/BookIncubationRecipePageModel.java @@ -0,0 +1,42 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.integration.modonomicon.page.incubation; + +import com.klikli_dev.modonomicon.api.datagen.book.page.BookRecipePageModel; +import com.klikli_dev.theurgy.integration.modonomicon.TheurgyModonomiconConstants; +import org.jetbrains.annotations.NotNull; + +public class BookIncubationRecipePageModel extends BookRecipePageModel { + protected BookIncubationRecipePageModel(@NotNull String anchor) { + super(TheurgyModonomiconConstants.Page.INCUBATION_RECIPE, anchor); + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder extends BookRecipePageModel.Builder { + protected Builder() { + super(); + } + + public BookIncubationRecipePageModel build() { + var model = new BookIncubationRecipePageModel(this.anchor); + model.title1 = this.title1; + model.recipeId1 = this.recipeId1; + model.title2 = this.title2; + model.recipeId2 = this.recipeId2; + model.text = this.text; + return model; + } + + @Override + public Builder getThis() { + return this; + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/incubation/BookIncubationRecipePageRenderer.java b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/incubation/BookIncubationRecipePageRenderer.java new file mode 100644 index 000000000..9c4c518c9 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/incubation/BookIncubationRecipePageRenderer.java @@ -0,0 +1,105 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.integration.modonomicon.page.incubation; + +import com.klikli_dev.modonomicon.client.gui.book.BookContentScreen; +import com.klikli_dev.modonomicon.client.render.page.BookRecipePageRenderer; +import com.klikli_dev.theurgy.content.gui.GuiTextures; +import com.klikli_dev.theurgy.content.recipe.IncubationRecipe; +import com.klikli_dev.theurgy.content.recipe.LiquefactionRecipe; +import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.world.item.ItemStack; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class BookIncubationRecipePageRenderer extends BookRecipePageRenderer { + + protected Map renderableSulfurIngredients = new HashMap<>(); + + public BookIncubationRecipePageRenderer(BookIncubationRecipePage page) { + super(page); + } + + @Override + protected int getRecipeHeight() { + return 65; + } + + @Override + public void onBeginDisplayPage(BookContentScreen parentScreen, int left, int top) { + super.onBeginDisplayPage(parentScreen, left, top); + + //sulfurs in the recipe are in most cases specified only via the item id (as one sulfur = one item), but for rendering we need the nbt, so we get it from the corresponding recipe. + var recipeManager = Minecraft.getInstance().level.getRecipeManager(); + var liquefactionRecipes = recipeManager.getAllRecipesFor(RecipeTypeRegistry.LIQUEFACTION.get()).stream().filter(r -> r.getResultItem(Minecraft.getInstance().level.registryAccess()) != null).collect(Collectors.toList()); + + if (this.page.getRecipe1() != null) + this.renderableSulfurIngredients.put(this.page.getRecipe1(), this.getRenderableSulfurIngredients(liquefactionRecipes, this.page.getRecipe1())); + if (this.page.getRecipe2() != null) + this.renderableSulfurIngredients.put(this.page.getRecipe2(), this.getRenderableSulfurIngredients(liquefactionRecipes, this.page.getRecipe2())); + } + + protected ItemStack[] getRenderableSulfurIngredients(List liquefactionRecipes, IncubationRecipe recipe) { + return Arrays.stream(recipe.getSulfur().getItems()).map(sulfur -> { + if (sulfur.hasTag()) + return sulfur; + + var sulfurItem = sulfur.getItem(); + var sulfurWithNbt = liquefactionRecipes.stream() + .filter(r -> r.getResultItem(Minecraft.getInstance().level.registryAccess()).getItem() == sulfurItem).map(r -> r.getResultItem(Minecraft.getInstance().level.registryAccess())).findFirst(); + + if (sulfurWithNbt.isPresent()) { + sulfur = sulfur.copy(); + sulfur.setTag(sulfurWithNbt.get().getTag()); + } + + return sulfur; + }).toArray(ItemStack[]::new); + } + + @Override + protected void drawRecipe(GuiGraphics guiGraphics, IncubationRecipe recipe, int recipeX, int recipeY, int mouseX, int mouseY, boolean second) { + recipeY += 10; + + if (!second) { + if (!this.page.getTitle1().isEmpty()) { + this.renderTitle(guiGraphics, this.page.getTitle1(), false, BookContentScreen.PAGE_WIDTH / 2, 0); + } + } else { + if (!this.page.getTitle2().isEmpty()) { + this.renderTitle(guiGraphics, this.page.getTitle2(), false, BookContentScreen.PAGE_WIDTH / 2, + recipeY - (this.page.getTitle2().getString().isEmpty() ? 10 : 0) - 10); + } + } + + + GuiTextures.MODONOMICON_SLOT.render(guiGraphics, recipeX, recipeY); //render the mercury input slot + this.parentScreen.renderIngredient(guiGraphics, recipeX + 3, recipeY + 3, mouseX, mouseY, recipe.getMercury()); + + GuiTextures.MODONOMICON_SLOT.render(guiGraphics, recipeX + 24, recipeY); //render the salt input slot + this.parentScreen.renderIngredient(guiGraphics, recipeX + 24 + 3, recipeY + 3, mouseX, mouseY, recipe.getSalt()); + + GuiTextures.MODONOMICON_SLOT.render(guiGraphics, recipeX, recipeY + 24); //render the sulfur input slot + var sulfurs = this.renderableSulfurIngredients.get(recipe); + if (sulfurs != null && sulfurs.length > 0) { + this.parentScreen.renderItemStacks(guiGraphics, recipeX + 3, recipeY + 24 + 3, mouseX, mouseY, List.of(sulfurs)); + } + + + GuiTextures.MODONOMICON_SLOT.render(guiGraphics, recipeX + 61 + 14, recipeY); //render the output slot + this.parentScreen.renderItemStack(guiGraphics, recipeX + 61 + 3 + 14, recipeY + 3, mouseX, mouseY, recipe.getResultItem(this.parentScreen.getMinecraft().level.registryAccess())); + + GuiTextures.MODONOMICON_ARROW_RIGHT.render(guiGraphics, recipeX + 40 + 16, recipeY + 7); //render the arrow + this.parentScreen.renderItemStack(guiGraphics, recipeX + 36 + 16, recipeY + 24, mouseX, mouseY, recipe.getToastSymbol()); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/liquefaction/BookLiquefactionRecipePage.java b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/liquefaction/BookLiquefactionRecipePage.java new file mode 100644 index 000000000..c7645667f --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/liquefaction/BookLiquefactionRecipePage.java @@ -0,0 +1,47 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.integration.modonomicon.page.liquefaction; + +import com.google.gson.JsonObject; +import com.klikli_dev.modonomicon.book.BookTextHolder; +import com.klikli_dev.modonomicon.book.page.BookProcessingRecipePage; +import com.klikli_dev.modonomicon.book.page.BookRecipePage; +import com.klikli_dev.theurgy.content.recipe.LiquefactionRecipe; +import com.klikli_dev.theurgy.integration.modonomicon.TheurgyModonomiconConstants; +import com.klikli_dev.theurgy.registry.RecipeTypeRegistry; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; + +public class BookLiquefactionRecipePage extends BookProcessingRecipePage { + public BookLiquefactionRecipePage(BookTextHolder title1, ResourceLocation recipeId1, BookTextHolder title2, ResourceLocation recipeId2, BookTextHolder text, String anchor) { + super(RecipeTypeRegistry.LIQUEFACTION.get(), title1, recipeId1, title2, recipeId2, text, anchor); + } + + public static BookLiquefactionRecipePage fromJson(JsonObject json) { + var common = BookRecipePage.commonFromJson(json); + var anchor = GsonHelper.getAsString(json, "anchor", ""); + return new BookLiquefactionRecipePage(common.title1(), common.recipeId1(), common.title2(), common.recipeId2(), common.text(), anchor); + } + + public static BookLiquefactionRecipePage fromNetwork(FriendlyByteBuf buffer) { + var common = BookRecipePage.commonFromNetwork(buffer); + var anchor = buffer.readUtf(); + return new BookLiquefactionRecipePage(common.title1(), common.recipeId1(), common.title2(), common.recipeId2(), common.text(), anchor); + } + + @Override + public ResourceLocation getType() { + return TheurgyModonomiconConstants.Page.LIQUEFACTION_RECIPE; + } + + @Override + public void toNetwork(FriendlyByteBuf buffer) { + super.toNetwork(buffer); + buffer.writeUtf(this.anchor); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/liquefaction/BookLiquefactionRecipePageModel.java b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/liquefaction/BookLiquefactionRecipePageModel.java new file mode 100644 index 000000000..1ba9b62f0 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/liquefaction/BookLiquefactionRecipePageModel.java @@ -0,0 +1,42 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.integration.modonomicon.page.liquefaction; + +import com.klikli_dev.modonomicon.api.datagen.book.page.BookRecipePageModel; +import com.klikli_dev.theurgy.integration.modonomicon.TheurgyModonomiconConstants; +import org.jetbrains.annotations.NotNull; + +public class BookLiquefactionRecipePageModel extends BookRecipePageModel { + protected BookLiquefactionRecipePageModel(@NotNull String anchor) { + super(TheurgyModonomiconConstants.Page.LIQUEFACTION_RECIPE, anchor); + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder extends BookRecipePageModel.Builder { + protected Builder() { + super(); + } + + public BookLiquefactionRecipePageModel build() { + var model = new BookLiquefactionRecipePageModel(this.anchor); + model.title1 = this.title1; + model.recipeId1 = this.recipeId1; + model.title2 = this.title2; + model.recipeId2 = this.recipeId2; + model.text = this.text; + return model; + } + + @Override + public Builder getThis() { + return this; + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/liquefaction/BookLiquefactionRecipePageRenderer.java b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/liquefaction/BookLiquefactionRecipePageRenderer.java new file mode 100644 index 000000000..595b7ff66 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/integration/modonomicon/page/liquefaction/BookLiquefactionRecipePageRenderer.java @@ -0,0 +1,58 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.integration.modonomicon.page.liquefaction; + +import com.klikli_dev.modonomicon.client.gui.book.BookContentScreen; +import com.klikli_dev.modonomicon.client.render.page.BookRecipePageRenderer; +import com.klikli_dev.modonomicon.fluid.FluidHolder; +import com.klikli_dev.modonomicon.fluid.ForgeFluidHolder; +import com.klikli_dev.theurgy.content.gui.GuiTextures; +import com.klikli_dev.theurgy.content.recipe.LiquefactionRecipe; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraftforge.fluids.FluidType; + +import java.util.Arrays; + +public class BookLiquefactionRecipePageRenderer extends BookRecipePageRenderer { + public BookLiquefactionRecipePageRenderer(BookLiquefactionRecipePage page) { + super(page); + } + + @Override + protected int getRecipeHeight() { + return 60; + } + + @Override + protected void drawRecipe(GuiGraphics guiGraphics, LiquefactionRecipe recipe, int recipeX, int recipeY, int mouseX, int mouseY, boolean second) { + recipeY += 10; + + if (!second) { + if (!this.page.getTitle1().isEmpty()) { + this.renderTitle(guiGraphics, this.page.getTitle1(), false, BookContentScreen.PAGE_WIDTH / 2, 0); + } + } else { + if (!this.page.getTitle2().isEmpty()) { + this.renderTitle(guiGraphics, this.page.getTitle2(), false, BookContentScreen.PAGE_WIDTH / 2, + recipeY - (this.page.getTitle2().getString().isEmpty() ? 10 : 0) - 10); + } + } + + GuiTextures.MODONOMICON_SLOT.render(guiGraphics, recipeX, recipeY); //render the fluid input slot + this.parentScreen.renderFluidStacks(guiGraphics, recipeX + 2, recipeY + 2, mouseX, mouseY, Arrays.stream(recipe.getSolvent().getFluids()).map(f -> (FluidHolder) new ForgeFluidHolder(f)).toList(), FluidType.BUCKET_VOLUME); + + GuiTextures.MODONOMICON_SLOT.render(guiGraphics, recipeX, recipeY + 24); //render the item input slot + this.parentScreen.renderIngredient(guiGraphics, recipeX + 3, recipeY + 24 + +3, mouseX, mouseY, recipe.getIngredients().get(0)); + + GuiTextures.MODONOMICON_SLOT.render(guiGraphics, recipeX + 61, recipeY); //render the output slot + this.parentScreen.renderItemStack(guiGraphics, recipeX + 61 + 3, recipeY + 3, mouseX, mouseY, recipe.getResultItem(this.parentScreen.getMinecraft().level.registryAccess())); + + GuiTextures.MODONOMICON_ARROW_RIGHT.render(guiGraphics, recipeX + 40, recipeY + 7); //render the arrow + this.parentScreen.renderItemStack(guiGraphics, recipeX + 36, recipeY + 20, mouseX, mouseY, recipe.getToastSymbol()); + } + +} diff --git a/src/main/java/com/klikli_dev/theurgy/item/AlchemicalSulfurItem.java b/src/main/java/com/klikli_dev/theurgy/item/AlchemicalSulfurItem.java deleted file mode 100644 index 62b8151a4..000000000 --- a/src/main/java/com/klikli_dev/theurgy/item/AlchemicalSulfurItem.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2022 klikli-dev - * - * SPDX-License-Identifier: MIT - */ - -package com.klikli_dev.theurgy.item; - -import com.google.common.collect.ImmutableList; -import com.klikli_dev.theurgy.Theurgy; -import com.klikli_dev.theurgy.TheurgyConstants; -import com.klikli_dev.theurgy.client.render.SulfurBEWLR; -import net.minecraft.ChatFormatting; -import net.minecraft.client.Minecraft; -import net.minecraft.client.renderer.BlockEntityWithoutLevelRenderer; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.ComponentUtils; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.network.chat.Style; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.CreativeModeTab; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraftforge.client.extensions.common.IClientItemExtensions; -import net.minecraftforge.registries.ForgeRegistries; - -import java.util.List; -import java.util.function.Consumer; - -public class AlchemicalSulfurItem extends Item { - public AlchemicalSulfurItem(Properties pProperties) { - super(pProperties); - } - - public static ItemStack getSourceStack(ItemStack sulfurStack) { - if (sulfurStack.hasTag() && sulfurStack.getTag().contains(TheurgyConstants.Nbt.SULFUR_SOURCE_ID)) { - var itemId = new ResourceLocation(sulfurStack.getTag().getString(TheurgyConstants.Nbt.SULFUR_SOURCE_ID)); - var sourceStack = new ItemStack(ForgeRegistries.ITEMS.getValue(itemId)); - - if (sulfurStack.getTag().contains(TheurgyConstants.Nbt.SULFUR_SOURCE_NBT)) - sourceStack.setTag(sulfurStack.getTag().getCompound(TheurgyConstants.Nbt.SULFUR_SOURCE_NBT)); - return sourceStack; - } - - return ItemStack.EMPTY; - } - - public static List getTooltipData(ItemStack sulfurStack) { - var source = getSourceStack(sulfurStack); - - if (!source.isEmpty() && source.getHoverName() instanceof MutableComponent hoverName) - return ImmutableList.of(hoverName.withStyle(Style.EMPTY - .withColor(ChatFormatting.GREEN) - .withItalic(true) - )); - - return ImmutableList.of(); - } - - @Override - public void initializeClient(Consumer consumer) { - consumer.accept(new IClientItemExtensions() { - @Override - public BlockEntityWithoutLevelRenderer getCustomRenderer() { - return SulfurBEWLR.get(); - } - }); - } - - @Override - public Component getName(ItemStack pStack) { - var source = getSourceStack(pStack); - - if (!source.isEmpty() && source.getHoverName() instanceof MutableComponent hoverName) - return Component.translatable(this.getDescriptionId(), ComponentUtils.wrapInSquareBrackets( - hoverName.withStyle(Style.EMPTY - .withColor(ChatFormatting.GREEN) - .withItalic(true) - ))); - - return super.getName(pStack); - } - - /** - * Inner class to avoid classloading issues on the server - */ - public static class DistHelper { - - public static void registerCreativeModeTabs(AlchemicalSulfurItem item, CreativeModeTab.Output output) { - var level = Minecraft.getInstance().level; - if (level != null) { - var recipeManager = level.getRecipeManager(); - recipeManager.getRecipes().forEach((recipe) -> { - if (recipe.getResultItem(level.registryAccess()) != null && recipe.getResultItem(level.registryAccess()).getItem() == item) { - output.accept(recipe.getResultItem(level.registryAccess()).copy()); - } - }); - } - } - } -} diff --git a/src/main/java/com/klikli_dev/theurgy/network/Message.java b/src/main/java/com/klikli_dev/theurgy/network/Message.java index 6b2b0829a..4251386cd 100644 --- a/src/main/java/com/klikli_dev/theurgy/network/Message.java +++ b/src/main/java/com/klikli_dev/theurgy/network/Message.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022 klikli-dev + * SPDX-FileCopyrightText: 2023 klikli-dev * * SPDX-License-Identifier: MIT */ diff --git a/src/main/java/com/klikli_dev/theurgy/network/MessageHandler.java b/src/main/java/com/klikli_dev/theurgy/network/MessageHandler.java index 1e7a5838c..09e4f106a 100644 --- a/src/main/java/com/klikli_dev/theurgy/network/MessageHandler.java +++ b/src/main/java/com/klikli_dev/theurgy/network/MessageHandler.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022 klikli-dev + * SPDX-FileCopyrightText: 2023 klikli-dev * * SPDX-License-Identifier: MIT */ diff --git a/src/main/java/com/klikli_dev/theurgy/network/Networking.java b/src/main/java/com/klikli_dev/theurgy/network/Networking.java index e2163ac5a..adb828196 100644 --- a/src/main/java/com/klikli_dev/theurgy/network/Networking.java +++ b/src/main/java/com/klikli_dev/theurgy/network/Networking.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022 klikli-dev + * SPDX-FileCopyrightText: 2023 klikli-dev * * SPDX-License-Identifier: MIT */ @@ -55,7 +55,7 @@ public static void sendToSplit(ServerPlayer player, T message) { } public static void sendTo(ServerPlayer player, T message) { - if(player.connection == null){ + if (player.connection == null) { //workaround for https://github.com/klikli-dev/modonomicon/issues/46 / https://github.com/klikli-dev/modonomicon/issues/62 //we should never get here unless some other mod interferes with networking Theurgy.LOGGER.warn("Tried to send message of type {} to player without connection. Id: {}, Name: {}.", player.getStringUUID(), player.getName().getString(), message.getClass().getName()); diff --git a/src/main/java/com/klikli_dev/theurgy/network/messages/MessageSetDivinationResult.java b/src/main/java/com/klikli_dev/theurgy/network/messages/MessageSetDivinationResult.java index 64c267273..222db3513 100644 --- a/src/main/java/com/klikli_dev/theurgy/network/messages/MessageSetDivinationResult.java +++ b/src/main/java/com/klikli_dev/theurgy/network/messages/MessageSetDivinationResult.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022 klikli-dev + * SPDX-FileCopyrightText: 2023 klikli-dev * * SPDX-License-Identifier: MIT */ @@ -7,7 +7,7 @@ package com.klikli_dev.theurgy.network.messages; import com.klikli_dev.theurgy.TheurgyConstants; -import com.klikli_dev.theurgy.item.DivinationRodItem; +import com.klikli_dev.theurgy.content.item.DivinationRodItem; import com.klikli_dev.theurgy.network.Message; import net.minecraft.core.BlockPos; import net.minecraft.network.FriendlyByteBuf; @@ -38,7 +38,7 @@ public void onServerReceived(MinecraftServer minecraftServer, ServerPlayer playe if (stack.getItem() instanceof DivinationRodItem) { var tag = stack.getOrCreateTag(); tag.putFloat(TheurgyConstants.Nbt.Divination.DISTANCE, this.distance); - if(this.pos != null) { + if (this.pos != null) { tag.putLong(TheurgyConstants.Nbt.Divination.POS, this.pos.asLong()); } player.inventoryMenu.broadcastChanges(); diff --git a/src/main/java/com/klikli_dev/theurgy/registry/BlockEntityRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/BlockEntityRegistry.java new file mode 100644 index 000000000..53acaf8f4 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/registry/BlockEntityRegistry.java @@ -0,0 +1,67 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.registry; + +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.content.apparatus.calcinationoven.CalcinationOvenBlockEntity; +import com.klikli_dev.theurgy.content.apparatus.distiller.DistillerBlockEntity; +import com.klikli_dev.theurgy.content.apparatus.incubator.IncubatorBlockEntity; +import com.klikli_dev.theurgy.content.apparatus.incubator.IncubatorMercuryVesselBlockEntity; +import com.klikli_dev.theurgy.content.apparatus.incubator.IncubatorSaltVesselBlockEntity; +import com.klikli_dev.theurgy.content.apparatus.incubator.IncubatorSulfurVesselBlockEntity; +import com.klikli_dev.theurgy.content.apparatus.liquefactioncauldron.LiquefactionCauldronBlockEntity; +import com.klikli_dev.theurgy.content.apparatus.pyromanticbrazier.PyromanticBrazierBlockEntity; +import com.klikli_dev.theurgy.content.apparatus.salammoniacaccumulator.SalAmmoniacAccumulatorBlockEntity; +import com.klikli_dev.theurgy.content.apparatus.salammoniactank.SalAmmoniacTankBlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; + +public class BlockEntityRegistry { + public static final DeferredRegister> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCK_ENTITY_TYPES, Theurgy.MODID); + + public static final RegistryObject> CALCINATION_OVEN = + BLOCKS.register("calcination_oven", () -> + BlockEntityType.Builder.of(CalcinationOvenBlockEntity::new, BlockRegistry.CALCINATION_OVEN.get()).build(null)); + + public static final RegistryObject> PYROMANTIC_BRAZIER = + BLOCKS.register("pyromantic_brazier", () -> + BlockEntityType.Builder.of(PyromanticBrazierBlockEntity::new, BlockRegistry.PYROMANTIC_BRAZIER.get()).build(null)); + + public static final RegistryObject> LIQUEFACTION_CAULDRON = + BLOCKS.register("liquefaction_cauldron", () -> + BlockEntityType.Builder.of(LiquefactionCauldronBlockEntity::new, BlockRegistry.LIQUEFACTION_CAULDRON.get()).build(null)); + + public static final RegistryObject> DISTILLER = + BLOCKS.register("distiller", () -> + BlockEntityType.Builder.of(DistillerBlockEntity::new, BlockRegistry.DISTILLER.get()).build(null)); + + public static final RegistryObject> INCUBATOR = + BLOCKS.register("incubator", () -> + BlockEntityType.Builder.of(IncubatorBlockEntity::new, BlockRegistry.INCUBATOR.get()).build(null)); + + public static final RegistryObject> INCUBATOR_MERCURY_VESSEL = + BLOCKS.register("incubator_mercury_vessel", () -> + BlockEntityType.Builder.of(IncubatorMercuryVesselBlockEntity::new, BlockRegistry.INCUBATOR_MERCURY_VESSEL.get()).build(null)); + + public static final RegistryObject> INCUBATOR_SALT_VESSEL = + BLOCKS.register("incubator_salt_vessel", () -> + BlockEntityType.Builder.of(IncubatorSaltVesselBlockEntity::new, BlockRegistry.INCUBATOR_SALT_VESSEL.get()).build(null)); + + public static final RegistryObject> INCUBATOR_SULFUR_VESSEL = + BLOCKS.register("incubator_sulfur_vessel", () -> + BlockEntityType.Builder.of(IncubatorSulfurVesselBlockEntity::new, BlockRegistry.INCUBATOR_SULFUR_VESSEL.get()).build(null)); + + public static final RegistryObject> SAL_AMMONIAC_TANK = + BLOCKS.register("sal_ammoniac_tank", () -> + BlockEntityType.Builder.of(SalAmmoniacTankBlockEntity::new, BlockRegistry.SAL_AMMONIAC_TANK.get()).build(null)); + + public static final RegistryObject> SAL_AMMONIAC_ACCUMULATOR = + BLOCKS.register("sal_ammoniac_accumulator", () -> + BlockEntityType.Builder.of(SalAmmoniacAccumulatorBlockEntity::new, BlockRegistry.SAL_AMMONIAC_ACCUMULATOR.get()).build(null)); +} diff --git a/src/main/java/com/klikli_dev/theurgy/registry/BlockRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/BlockRegistry.java new file mode 100644 index 000000000..5daae9322 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/registry/BlockRegistry.java @@ -0,0 +1,112 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.registry; + +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.content.apparatus.calcinationoven.CalcinationOvenBlock; +import com.klikli_dev.theurgy.content.apparatus.distiller.DistillerBlock; +import com.klikli_dev.theurgy.content.apparatus.incubator.IncubatorBlock; +import com.klikli_dev.theurgy.content.apparatus.incubator.IncubatorMercuryVesselBlock; +import com.klikli_dev.theurgy.content.apparatus.incubator.IncubatorSaltVesselBlock; +import com.klikli_dev.theurgy.content.apparatus.incubator.IncubatorSulfurVesselBlock; +import com.klikli_dev.theurgy.content.apparatus.liquefactioncauldron.LiquefactionCauldronBlock; +import com.klikli_dev.theurgy.content.apparatus.pyromanticbrazier.PyromanticBrazierBlock; +import com.klikli_dev.theurgy.content.apparatus.salammoniacaccumulator.SalAmmoniacAccumulatorBlock; +import com.klikli_dev.theurgy.content.apparatus.salammoniactank.SalAmmoniacTankBlock; +import net.minecraft.util.valueproviders.UniformInt; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.DropExperienceBlock; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.material.MapColor; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; + +public class BlockRegistry { + public static final DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, Theurgy.MODID); + + public static final RegistryObject CALCINATION_OVEN = + BLOCKS.register("calcination_oven", () -> new CalcinationOvenBlock(BlockBehaviour.Properties.of() + .mapColor(MapColor.METAL) + .noOcclusion() + .sound(SoundType.METAL) + .strength(1.0f))); + + public static final RegistryObject PYROMANTIC_BRAZIER = + BLOCKS.register("pyromantic_brazier", () -> new PyromanticBrazierBlock(BlockBehaviour.Properties.of() + .mapColor(MapColor.METAL) + .noOcclusion() + .sound(SoundType.METAL) + .strength(1.0f) + .lightLevel((state) -> state.getValue(BlockStateProperties.LIT) ? 14 : 0))); + + public static final RegistryObject LIQUEFACTION_CAULDRON = + BLOCKS.register("liquefaction_cauldron", () -> new LiquefactionCauldronBlock(BlockBehaviour.Properties.of() + .mapColor(MapColor.METAL) + .noOcclusion() + .sound(SoundType.METAL) + .strength(1.0f))); + + public static final RegistryObject DISTILLER = + BLOCKS.register("distiller", () -> new DistillerBlock(BlockBehaviour.Properties.of() + .mapColor(MapColor.METAL) + .noOcclusion() + .sound(SoundType.METAL) + .strength(1.0f))); + + public static final RegistryObject INCUBATOR = + BLOCKS.register("incubator", () -> new IncubatorBlock(BlockBehaviour.Properties.of() + .mapColor(MapColor.METAL) + .noOcclusion() + .sound(SoundType.METAL) + .strength(1.0f))); + + public static final RegistryObject INCUBATOR_MERCURY_VESSEL = + BLOCKS.register("incubator_mercury_vessel", () -> new IncubatorMercuryVesselBlock(BlockBehaviour.Properties.of() + .mapColor(MapColor.METAL) + .noOcclusion() + .sound(SoundType.METAL) + .strength(1.0f))); + + public static final RegistryObject INCUBATOR_SALT_VESSEL = + BLOCKS.register("incubator_salt_vessel", () -> new IncubatorSaltVesselBlock(BlockBehaviour.Properties.of() + .mapColor(MapColor.METAL) + .noOcclusion() + .sound(SoundType.METAL) + .strength(1.0f))); + + public static final RegistryObject INCUBATOR_SULFUR_VESSEL = + BLOCKS.register("incubator_sulfur_vessel", () -> new IncubatorSulfurVesselBlock(BlockBehaviour.Properties.of() + .mapColor(MapColor.METAL) + .noOcclusion() + .sound(SoundType.METAL) + .strength(1.0f))); + + public static final RegistryObject SAL_AMMONIAC_ACCUMULATOR = + BLOCKS.register("sal_ammoniac_accumulator", () -> new SalAmmoniacAccumulatorBlock(BlockBehaviour.Properties.of() + .mapColor(MapColor.METAL) + .noOcclusion() + .sound(SoundType.METAL) + .strength(1.0f))); + + public static final RegistryObject SAL_AMMONIAC_TANK = + BLOCKS.register("sal_ammoniac_tank", () -> new SalAmmoniacTankBlock(BlockBehaviour.Properties.of() + .mapColor(MapColor.METAL) + .noOcclusion() + .sound(SoundType.METAL) + .strength(1.0f))); + + public static final RegistryObject SAL_AMMONIAC_ORE = BLOCKS.register("sal_ammoniac_ore", () -> + new DropExperienceBlock(BlockBehaviour.Properties.of().requiresCorrectToolForDrops().strength(3.0F, 3.0F), UniformInt.of(2, 5))); + + public static final RegistryObject DEEPSLATE_SAL_AMMONIAC_ORE = BLOCKS.register("deepslate_sal_ammoniac_ore", () -> + new DropExperienceBlock(BlockBehaviour.Properties.copy(SAL_AMMONIAC_ORE.get()).mapColor(MapColor.DEEPSLATE).strength(4.5f, 3.0f).sound(SoundType.DEEPSLATE), UniformInt.of(2, 5))); + + +} diff --git a/src/main/java/com/klikli_dev/theurgy/registry/BlockTagRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/BlockTagRegistry.java new file mode 100644 index 000000000..99a83ec3e --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/registry/BlockTagRegistry.java @@ -0,0 +1,44 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.registry; + +import com.klikli_dev.theurgy.Theurgy; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.block.Block; + +public class BlockTagRegistry { + + public static final TagKey DIVINATION_ROD_T1_ALLOWED_BLOCKS = tag("divination_rod_t1_allowed_blocks"); + public static final TagKey DIVINATION_ROD_T2_ALLOWED_BLOCKS = tag("divination_rod_t2_allowed_blocks"); + public static final TagKey DIVINATION_ROD_T3_ALLOWED_BLOCKS = tag("divination_rod_t3_allowed_blocks"); + public static final TagKey DIVINATION_ROD_T4_ALLOWED_BLOCKS = tag("divination_rod_t4_allowed_blocks"); + + public static final TagKey DIVINATION_ROD_T1_DISALLOWED_BLOCKS = tag("divination_rod_t1_disallowed_blocks"); + public static final TagKey DIVINATION_ROD_T2_DISALLOWED_BLOCKS = tag("divination_rod_t2_disallowed_blocks"); + public static final TagKey DIVINATION_ROD_T3_DISALLOWED_BLOCKS = tag("divination_rod_t3_disallowed_blocks"); + public static final TagKey DIVINATION_ROD_T4_DISALLOWED_BLOCKS = tag("divination_rod_t4_disallowed_blocks"); + + + public static final TagKey INCUBATOR_VESSELS = tag("incubator_vessels"); + public static final TagKey SAL_AMMONIAC_ORES = forgeTag("ores/sal_ammoniac"); + + + public static TagKey tag(String id) { + return tag(Theurgy.loc(id)); + } + + public static TagKey forgeTag(String id) { + return tag(new ResourceLocation("forge", id)); + } + + public static TagKey tag(ResourceLocation id) { + return TagKey.create(Registries.BLOCK, id); + } + +} diff --git a/src/main/java/com/klikli_dev/theurgy/registry/CapabilityRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/CapabilityRegistry.java new file mode 100644 index 000000000..2979b25eb --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/registry/CapabilityRegistry.java @@ -0,0 +1,25 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.registry; + +import com.klikli_dev.theurgy.content.capability.HeatProvider; +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 CapabilityRegistry { + + public static Capability HEAT_PROVIDER = CapabilityManager.get(new CapabilityToken<>() { + }); + + + public static void onRegisterCapabilities(final RegisterCapabilitiesEvent event) { + event.register(HeatProvider.class); + } + +} diff --git a/src/main/java/com/klikli_dev/theurgy/registry/CreativeModeTabRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/CreativeModeTabRegistry.java index 49b9af9f2..dec72661c 100644 --- a/src/main/java/com/klikli_dev/theurgy/registry/CreativeModeTabRegistry.java +++ b/src/main/java/com/klikli_dev/theurgy/registry/CreativeModeTabRegistry.java @@ -8,8 +8,7 @@ import com.klikli_dev.theurgy.Theurgy; import com.klikli_dev.theurgy.TheurgyConstants; -import com.klikli_dev.theurgy.item.AlchemicalSulfurItem; -import com.klikli_dev.theurgy.item.DivinationRodItem; +import com.klikli_dev.theurgy.content.item.DivinationRodItem; import net.minecraft.core.registries.Registries; import net.minecraft.network.chat.Component; import net.minecraft.world.item.CreativeModeTab; @@ -25,11 +24,36 @@ public class CreativeModeTabRegistry { .icon(() -> ItemRegistry.EMPTY_JAR.get().getDefaultInstance()) .title(Component.translatable(TheurgyConstants.I18n.ITEM_GROUP)) .displayItems((parameters, output) -> { - AlchemicalSulfurItem.DistHelper.registerCreativeModeTabs(ItemRegistry.ALCHEMICAL_SULFUR.get(), output); DivinationRodItem.DistHelper.registerCreativeModeTabs(ItemRegistry.DIVINATION_ROD_T1.get(), output); DivinationRodItem.DistHelper.registerCreativeModeTabs(ItemRegistry.DIVINATION_ROD_T2.get(), output); DivinationRodItem.DistHelper.registerCreativeModeTabs(ItemRegistry.DIVINATION_ROD_T3.get(), output); DivinationRodItem.DistHelper.registerCreativeModeTabs(ItemRegistry.DIVINATION_ROD_T4.get(), output); + DivinationRodItem.DistHelper.registerCreativeModeTabs(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_ABUNDANT.get(), output); + DivinationRodItem.DistHelper.registerCreativeModeTabs(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_COMMON.get(), output); + DivinationRodItem.DistHelper.registerCreativeModeTabs(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_RARE.get(), output); + DivinationRodItem.DistHelper.registerCreativeModeTabs(ItemRegistry.SULFUR_ATTUNED_DIVINATION_ROD_PRECIOUS.get(), output); + DivinationRodItem.DistHelper.registerCreativeModeTabs(ItemRegistry.AMETHYST_DIVINATION_ROD.get(), output); + + output.accept(ItemRegistry.SAL_AMMONIAC_BUCKET.get()); + + output.accept(ItemRegistry.MERCURY_SHARD.get()); + output.accept(ItemRegistry.MERCURY_CRYSTAL.get()); + + output.accept(ItemRegistry.SAL_AMMONIAC_CRYSTAL.get()); + output.accept(ItemRegistry.SAL_AMMONIAC_ORE.get()); + output.accept(ItemRegistry.DEEPSLATE_SAL_AMMONIAC_ORE.get()); + + output.accept(ItemRegistry.CALCINATION_OVEN.get()); + output.accept(ItemRegistry.PYROMANTIC_BRAZIER.get()); + output.accept(ItemRegistry.LIQUEFACTION_CAULDRON.get()); + output.accept(ItemRegistry.DISTILLER.get()); + output.accept(ItemRegistry.INCUBATOR.get()); + output.accept(ItemRegistry.INCUBATOR_MERCURY_VESSEL.get()); + output.accept(ItemRegistry.INCUBATOR_SALT_VESSEL.get()); + output.accept(ItemRegistry.INCUBATOR_SULFUR_VESSEL.get()); + + output.accept(ItemRegistry.SAL_AMMONIAC_ACCUMULATOR.get()); + output.accept(ItemRegistry.SAL_AMMONIAC_TANK.get()); }).build()); } diff --git a/src/main/java/com/klikli_dev/theurgy/registry/EntityDataSerializerRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/EntityDataSerializerRegistry.java index 6f49d3aab..17b54932c 100644 --- a/src/main/java/com/klikli_dev/theurgy/registry/EntityDataSerializerRegistry.java +++ b/src/main/java/com/klikli_dev/theurgy/registry/EntityDataSerializerRegistry.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022 klikli-dev + * SPDX-FileCopyrightText: 2023 klikli-dev * * SPDX-License-Identifier: MIT */ diff --git a/src/main/java/com/klikli_dev/theurgy/registry/EntityRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/EntityRegistry.java index 9c11ef61b..ba90e10f8 100644 --- a/src/main/java/com/klikli_dev/theurgy/registry/EntityRegistry.java +++ b/src/main/java/com/klikli_dev/theurgy/registry/EntityRegistry.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022 klikli-dev + * SPDX-FileCopyrightText: 2023 klikli-dev * * SPDX-License-Identifier: MIT */ @@ -7,8 +7,7 @@ package com.klikli_dev.theurgy.registry; import com.klikli_dev.theurgy.Theurgy; -import com.klikli_dev.theurgy.entity.FollowProjectile; -import net.minecraft.network.syncher.EntityDataSerializer; +import com.klikli_dev.theurgy.content.entity.FollowProjectile; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; @@ -21,6 +20,10 @@ public class EntityRegistry { public static final DeferredRegister> ENTITIES = DeferredRegister.create(ForgeRegistries.ENTITY_TYPES, Theurgy.MODID); + static RegistryObject> register(String name, EntityType.Builder builder) { + return ENTITIES.register(name, () -> builder.build(Theurgy.MODID + ":" + name)); + } + public static final RegistryObject> FOLLOW_PROJECTILE = register( "follow_projectile", EntityType.Builder.of(FollowProjectile::new, MobCategory.MISC) @@ -28,8 +31,5 @@ public class EntityRegistry { .setTrackingRange(10) .setShouldReceiveVelocityUpdates(true).setCustomClientFactory(FollowProjectile::new)); - static RegistryObject> register(String name, EntityType.Builder builder) { - return ENTITIES.register(name, () -> builder.build(Theurgy.MODID + ":" + name)); - } } diff --git a/src/main/java/com/klikli_dev/theurgy/registry/FluidRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/FluidRegistry.java new file mode 100644 index 000000000..a6a433c93 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/registry/FluidRegistry.java @@ -0,0 +1,26 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.registry; + +import com.klikli_dev.theurgy.Theurgy; +import net.minecraft.world.level.material.FlowingFluid; +import net.minecraft.world.level.material.Fluid; +import net.minecraftforge.fluids.ForgeFlowingFluid; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; + +public class FluidRegistry { + public static final DeferredRegister FLUIDS = DeferredRegister.create(ForgeRegistries.FLUIDS, Theurgy.MODID); + + private static ForgeFlowingFluid.Properties salAmmoniacProperties() { + return new ForgeFlowingFluid.Properties(FluidTypeRegistry.SAL_AMMONIAC, SAL_AMMONIAC, SAL_AMMONIAC_FLOWING).bucket(ItemRegistry.SAL_AMMONIAC_BUCKET::get); + } + + public static final RegistryObject SAL_AMMONIAC = FLUIDS.register("sal_ammoniac", () -> new ForgeFlowingFluid.Source(salAmmoniacProperties())); + public static final RegistryObject SAL_AMMONIAC_FLOWING = FLUIDS.register("sal_ammoniac_flowing", () -> new ForgeFlowingFluid.Flowing(salAmmoniacProperties())); +} diff --git a/src/main/java/com/klikli_dev/theurgy/registry/FluidTagRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/FluidTagRegistry.java new file mode 100644 index 000000000..9460e941a --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/registry/FluidTagRegistry.java @@ -0,0 +1,26 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.registry; + +import com.klikli_dev.theurgy.Theurgy; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.material.Fluid; + +public class FluidTagRegistry { + public static final TagKey SOLVENT = tag("solvent"); + public static final TagKey SAL_AMMONIAC = tag("sal_ammoniac"); + + public static TagKey tag(String id) { + return tag(Theurgy.loc(id)); + } + + public static TagKey tag(ResourceLocation id) { + return TagKey.create(Registries.FLUID, id); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/registry/FluidTypeRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/FluidTypeRegistry.java new file mode 100644 index 000000000..5f4e4943b --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/registry/FluidTypeRegistry.java @@ -0,0 +1,20 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.registry; + +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.content.fluid.SolventFluidType; +import net.minecraftforge.fluids.FluidType; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; + +public class FluidTypeRegistry { + public static final DeferredRegister FLUID_TYPES = DeferredRegister.create(ForgeRegistries.Keys.FLUID_TYPES, Theurgy.MODID); + + public static final RegistryObject SAL_AMMONIAC = FLUID_TYPES.register("sal_ammoniac", () -> new SolventFluidType(FluidType.Properties.create(), Theurgy.loc("block/sal_ammoniac/still"), Theurgy.loc("block/sal_ammoniac/flow"), Theurgy.loc("block/sal_ammoniac/overlay"), 0xFFFF00FF)); +} diff --git a/src/main/java/com/klikli_dev/theurgy/registry/FoodRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/FoodRegistry.java new file mode 100644 index 000000000..273269b4b --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/registry/FoodRegistry.java @@ -0,0 +1,16 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.registry; + +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.food.FoodProperties; + +public class FoodRegistry { + public static final FoodProperties ALCHEMICAL_SALT = (new FoodProperties.Builder()).nutrition(2).saturationMod(0.2F).effect(() -> new MobEffectInstance(MobEffects.CONFUSION, 100, 1), 0.5f).build(); + +} diff --git a/src/main/java/com/klikli_dev/theurgy/registry/ItemRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/ItemRegistry.java index f64c97f8d..90c5fb1ab 100644 --- a/src/main/java/com/klikli_dev/theurgy/registry/ItemRegistry.java +++ b/src/main/java/com/klikli_dev/theurgy/registry/ItemRegistry.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022 klikli-dev + * SPDX-FileCopyrightText: 2023 klikli-dev * * SPDX-License-Identifier: MIT */ @@ -7,63 +7,117 @@ package com.klikli_dev.theurgy.registry; import com.klikli_dev.theurgy.Theurgy; -import com.klikli_dev.theurgy.TheurgyConstants; -import com.klikli_dev.theurgy.item.AlchemicalSulfurItem; -import com.klikli_dev.theurgy.item.DivinationRodItem; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Tiers; +import com.klikli_dev.theurgy.content.apparatus.calcinationoven.CalcinationOvenBlockItem; +import com.klikli_dev.theurgy.content.apparatus.distiller.DistillerBlockItem; +import com.klikli_dev.theurgy.content.apparatus.incubator.IncubatorMercuryVesselBlockItem; +import com.klikli_dev.theurgy.content.apparatus.incubator.IncubatorSaltVesselBlockItem; +import com.klikli_dev.theurgy.content.apparatus.incubator.IncubatorSulfurVesselBlockItem; +import com.klikli_dev.theurgy.content.apparatus.salammoniactank.SalAmmoniacTankBlockItem; +import com.klikli_dev.theurgy.content.item.DivinationRodItem; +import net.minecraft.world.item.*; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; public class ItemRegistry { public static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, Theurgy.MODID); + //Helper items for rendering public static final RegistryObject EMPTY_JAR = ITEMS.register("empty_jar", () -> new Item(new Item.Properties())); - - //helper item for sulfur rendering public static final RegistryObject EMPTY_JAR_LABELED = ITEMS.register("empty_jar_labeled", () -> new Item(new Item.Properties())); - - //helper item for hermetica rendering - public static final RegistryObject THE_HERMETICA_ICON = - ITEMS.register("the_hermetica_icon", () -> new Item(new Item.Properties())); - - //helper item for sulfur rendering public static final RegistryObject JAR_LABEL = ITEMS.register("jar_label", () -> new Item(new Item.Properties())); - public static final RegistryObject ALCHEMICAL_SULFUR = - ITEMS.register("alchemical_sulfur", () -> new AlchemicalSulfurItem(new Item.Properties())); - -// public static final RegistryObject SULFUR_INGOT = -// ITEMS.register("sulfur_ingot", () -> new Item(new Item.Properties())); - + public static final RegistryObject THE_HERMETICA_ICON = + ITEMS.register("the_hermetica_icon", () -> new Item(new Item.Properties())); + //Divination rods public static final RegistryObject DIVINATION_ROD_T1 = ITEMS.register("divination_rod_t1", () -> new DivinationRodItem( new Item.Properties().stacksTo(1).defaultDurability(1), - Tiers.STONE, TagRegistry.DIVINATION_ROD_T1_ALLOWED_BLOCKS, TagRegistry.DIVINATION_ROD_T1_DISALLOWED_BLOCKS, - 96, 40, 3, true)); + Tiers.STONE, BlockTagRegistry.DIVINATION_ROD_T1_ALLOWED_BLOCKS, BlockTagRegistry.DIVINATION_ROD_T1_DISALLOWED_BLOCKS, + 96, 40, 8, true)); public static final RegistryObject DIVINATION_ROD_T2 = ITEMS.register("divination_rod_t2", () -> new DivinationRodItem( new Item.Properties().stacksTo(1).defaultDurability(1), - Tiers.IRON, TagRegistry.DIVINATION_ROD_T2_ALLOWED_BLOCKS, TagRegistry.DIVINATION_ROD_T2_DISALLOWED_BLOCKS, - 96, 40, 6, true)); - + Tiers.IRON, BlockTagRegistry.DIVINATION_ROD_T2_ALLOWED_BLOCKS, BlockTagRegistry.DIVINATION_ROD_T2_DISALLOWED_BLOCKS, + 96, 40, 16, true)); public static final RegistryObject DIVINATION_ROD_T3 = ITEMS.register("divination_rod_t3", () -> new DivinationRodItem( new Item.Properties().stacksTo(1).defaultDurability(1), - Tiers.DIAMOND, TagRegistry.DIVINATION_ROD_T3_ALLOWED_BLOCKS, TagRegistry.DIVINATION_ROD_T3_DISALLOWED_BLOCKS, - 96, 40, 9, true)); + Tiers.DIAMOND, BlockTagRegistry.DIVINATION_ROD_T3_ALLOWED_BLOCKS, BlockTagRegistry.DIVINATION_ROD_T3_DISALLOWED_BLOCKS, + 96, 40, 32, true)); public static final RegistryObject DIVINATION_ROD_T4 = ITEMS.register("divination_rod_t4", () -> new DivinationRodItem( new Item.Properties().stacksTo(1).defaultDurability(1), - Tiers.NETHERITE, TagRegistry.DIVINATION_ROD_T4_ALLOWED_BLOCKS, TagRegistry.DIVINATION_ROD_T4_DISALLOWED_BLOCKS, - 96, 40, 12, true)); - //TODO: in the future, no attuning for higher tier rods + Tiers.NETHERITE, BlockTagRegistry.DIVINATION_ROD_T4_ALLOWED_BLOCKS, BlockTagRegistry.DIVINATION_ROD_T4_DISALLOWED_BLOCKS, + 96, 40, 128, true)); + + public static final RegistryObject SULFUR_ATTUNED_DIVINATION_ROD_ABUNDANT = + ITEMS.register("sulfur_attuned_divination_rod_abundant", () -> new DivinationRodItem( + new Item.Properties().stacksTo(1).defaultDurability(1), + Tiers.STONE, BlockTagRegistry.DIVINATION_ROD_T1_ALLOWED_BLOCKS, BlockTagRegistry.DIVINATION_ROD_T1_DISALLOWED_BLOCKS, + 96, 40, 16, false)); + + public static final RegistryObject SULFUR_ATTUNED_DIVINATION_ROD_COMMON = + ITEMS.register("sulfur_attuned_divination_rod_common", () -> new DivinationRodItem( + new Item.Properties().stacksTo(1).defaultDurability(1), + Tiers.STONE, BlockTagRegistry.DIVINATION_ROD_T1_ALLOWED_BLOCKS, BlockTagRegistry.DIVINATION_ROD_T1_DISALLOWED_BLOCKS, + 96, 40, 16, false)); + + public static final RegistryObject SULFUR_ATTUNED_DIVINATION_ROD_RARE = + ITEMS.register("sulfur_attuned_divination_rod_rare", () -> new DivinationRodItem( + new Item.Properties().stacksTo(1).defaultDurability(1), + Tiers.STONE, BlockTagRegistry.DIVINATION_ROD_T2_ALLOWED_BLOCKS, BlockTagRegistry.DIVINATION_ROD_T2_DISALLOWED_BLOCKS, + 96, 40, 32, false)); + + public static final RegistryObject SULFUR_ATTUNED_DIVINATION_ROD_PRECIOUS = + ITEMS.register("sulfur_attuned_divination_rod_precious", () -> new DivinationRodItem( + new Item.Properties().stacksTo(1).defaultDurability(1), + Tiers.STONE, BlockTagRegistry.DIVINATION_ROD_T3_ALLOWED_BLOCKS, BlockTagRegistry.DIVINATION_ROD_T3_DISALLOWED_BLOCKS, + 96, 40, 32, false)); + + public static final RegistryObject AMETHYST_DIVINATION_ROD = + ITEMS.register("amethyst_divination_rod", () -> new DivinationRodItem( + new Item.Properties().stacksTo(1).defaultDurability(1), + Tiers.STONE, BlockTagRegistry.DIVINATION_ROD_T1_ALLOWED_BLOCKS, BlockTagRegistry.DIVINATION_ROD_T1_DISALLOWED_BLOCKS, + 96, 40, 16, false)); + + //Buckets + public static final RegistryObject SAL_AMMONIAC_BUCKET = ITEMS.register("sal_ammoniac_bucket", () -> new BucketItem(FluidRegistry.SAL_AMMONIAC, new Item.Properties().craftRemainder(Items.BUCKET).stacksTo(1))); + + public static final RegistryObject MERCURY_SHARD = + ITEMS.register("mercury_shard", () -> new Item(new Item.Properties())); + //Ingredients + public static final RegistryObject MERCURY_CRYSTAL = + ITEMS.register("mercury_crystal", () -> new Item(new Item.Properties())); + public static final RegistryObject SAL_AMMONIAC_CRYSTAL = + ITEMS.register("sal_ammoniac_crystal", () -> new Item(new Item.Properties())); + //Blocks + public static final RegistryObject SAL_AMMONIAC_ORE = + ITEMS.register("sal_ammoniac_ore", () -> new BlockItem(BlockRegistry.SAL_AMMONIAC_ORE.get(), new Item.Properties())); + public static final RegistryObject DEEPSLATE_SAL_AMMONIAC_ORE = + ITEMS.register("deepslate_sal_ammoniac_ore", () -> new BlockItem(BlockRegistry.DEEPSLATE_SAL_AMMONIAC_ORE.get(), new Item.Properties())); + public static final RegistryObject CALCINATION_OVEN = + ITEMS.register("calcination_oven", () -> new CalcinationOvenBlockItem(BlockRegistry.CALCINATION_OVEN.get(), new Item.Properties())); + public static final RegistryObject PYROMANTIC_BRAZIER = + ITEMS.register("pyromantic_brazier", () -> new BlockItem(BlockRegistry.PYROMANTIC_BRAZIER.get(), new Item.Properties())); + public static final RegistryObject LIQUEFACTION_CAULDRON = + ITEMS.register("liquefaction_cauldron", () -> new BlockItem(BlockRegistry.LIQUEFACTION_CAULDRON.get(), new Item.Properties())); + public static final RegistryObject DISTILLER = + ITEMS.register("distiller", () -> new DistillerBlockItem(BlockRegistry.DISTILLER.get(), new Item.Properties())); + public static final RegistryObject INCUBATOR = + ITEMS.register("incubator", () -> new BlockItem(BlockRegistry.INCUBATOR.get(), new Item.Properties())); + public static final RegistryObject INCUBATOR_MERCURY_VESSEL = + ITEMS.register("incubator_mercury_vessel", () -> new IncubatorMercuryVesselBlockItem(BlockRegistry.INCUBATOR_MERCURY_VESSEL.get(), new Item.Properties())); + public static final RegistryObject INCUBATOR_SALT_VESSEL = + ITEMS.register("incubator_salt_vessel", () -> new IncubatorSaltVesselBlockItem(BlockRegistry.INCUBATOR_SALT_VESSEL.get(), new Item.Properties())); + public static final RegistryObject INCUBATOR_SULFUR_VESSEL = + ITEMS.register("incubator_sulfur_vessel", () -> new IncubatorSulfurVesselBlockItem(BlockRegistry.INCUBATOR_SULFUR_VESSEL.get(), new Item.Properties())); + public static final RegistryObject SAL_AMMONIAC_ACCUMULATOR = + ITEMS.register("sal_ammoniac_accumulator", () -> new BlockItem(BlockRegistry.SAL_AMMONIAC_ACCUMULATOR.get(), new Item.Properties())); + public static final RegistryObject SAL_AMMONIAC_TANK = + ITEMS.register("sal_ammoniac_tank", () -> new SalAmmoniacTankBlockItem(BlockRegistry.SAL_AMMONIAC_TANK.get(), new Item.Properties())); } diff --git a/src/main/java/com/klikli_dev/theurgy/registry/ItemTagRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/ItemTagRegistry.java new file mode 100644 index 000000000..1939fa281 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/registry/ItemTagRegistry.java @@ -0,0 +1,81 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.registry; + +import com.klikli_dev.theurgy.Theurgy; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; + +public class ItemTagRegistry { + + //complementary tag to Tags.Items.ORES, Tags.Items.RAW_MATERIALS, Tags.Items.INGOTS and Tags.Items.GEMS + public static final TagKey OTHER_MINERALS = tag("other_minerals"); + + public static final TagKey ALCHEMICAL_SULFURS = tag("alchemical_sulfurs"); + public static final TagKey ALCHEMICAL_SULFURS_METALS = tag("alchemical_sulfurs/metals"); + public static final TagKey ALCHEMICAL_SULFURS_METALS_ABUNDANT = tag("alchemical_sulfurs/metals/abundant"); + public static final TagKey ALCHEMICAL_SULFURS_METALS_COMMON = tag("alchemical_sulfurs/metals/common"); + public static final TagKey ALCHEMICAL_SULFURS_METALS_RARE = tag("alchemical_sulfurs/metals/rare"); + public static final TagKey ALCHEMICAL_SULFURS_METALS_PRECIOUS = tag("alchemical_sulfurs/metals/precious"); + public static final TagKey ALCHEMICAL_SULFURS_GEMS = tag("alchemical_sulfurs/gems"); + public static final TagKey ALCHEMICAL_SULFURS_GEMS_ABUNDANT = tag("alchemical_sulfurs/gems/abundant"); + public static final TagKey ALCHEMICAL_SULFURS_GEMS_COMMON = tag("alchemical_sulfurs/gems/common"); + public static final TagKey ALCHEMICAL_SULFURS_GEMS_RARE = tag("alchemical_sulfurs/gems/rare"); + public static final TagKey ALCHEMICAL_SULFURS_GEMS_PRECIOUS = tag("alchemical_sulfurs/gems/precious"); + public static final TagKey ALCHEMICAL_SULFURS_OTHER_MINERALS = tag("alchemical_sulfurs/other_minerals"); + public static final TagKey ALCHEMICAL_SULFURS_OTHER_MINERALS_ABUNDANT = tag("alchemical_sulfurs/other_minerals/abundant"); + public static final TagKey ALCHEMICAL_SULFURS_OTHER_MINERALS_COMMON = tag("alchemical_sulfurs/other_minerals/common"); + public static final TagKey ALCHEMICAL_SULFURS_OTHER_MINERALS_RARE = tag("alchemical_sulfurs/other_minerals/rare"); + public static final TagKey ALCHEMICAL_SULFURS_OTHER_MINERALS_PRECIOUS = tag("alchemical_sulfurs/other_minerals/precious"); + + public static final TagKey ALCHEMICAL_SULFURS_ABUNDANT = tag("alchemical_sulfurs/abundant"); + public static final TagKey ALCHEMICAL_SULFURS_COMMON = tag("alchemical_sulfurs/common"); + public static final TagKey ALCHEMICAL_SULFURS_RARE = tag("alchemical_sulfurs/rare"); + public static final TagKey ALCHEMICAL_SULFURS_PRECIOUS = tag("alchemical_sulfurs/precious"); + + public static final TagKey ALCHEMICAL_SALTS = tag("alchemical_salts"); + public static final TagKey ALCHEMICAL_MERCURIES = tag("alchemical_mercuries"); + + public static final TagKey SAL_AMMONIAC_GEMS = forgeTag("gems/sal_ammoniac"); + public static final TagKey SAL_AMMONIAC_ORES = forgeTag("ores/sal_ammoniac"); + + + public static final TagKey LOW_MERCURY_ORES = tag("ores/mercury/low"); + public static final TagKey MEDIUM_MERCURY_ORES = tag("ores/mercury/medium"); + public static final TagKey HIGH_MERCURY_ORES = tag("ores/mercury/high"); + + public static final TagKey LOW_MERCURY_RAW_MATERIALS = tag("raw_materials/mercury/low"); + public static final TagKey MEDIUM_MERCURY_RAW_MATERIALS = tag("raw_materials/mercury/medium"); + public static final TagKey HIGH_MERCURY_RAW_MATERIALS = tag("raw_materials/mercury/high"); + + public static final TagKey LOW_MERCURY_METALS = tag("metals/mercury/low"); + public static final TagKey MEDIUM_MERCURY_METALS = tag("metals/mercury/medium"); + public static final TagKey HIGH_MERCURY_METALS = tag("metals/mercury/high"); + + public static final TagKey LOW_MERCURY_GEMS = tag("gems/mercury/low"); + public static final TagKey MEDIUM_MERCURY_GEMS = tag("gems/mercury/medium"); + public static final TagKey HIGH_MERCURY_GEMS = tag("gems/mercury/high"); + + public static final TagKey LOW_MERCURY_OTHER_MINERALS = tag("other_minerals/mercury/low"); + public static final TagKey MEDIUM_MERCURY_OTHER_MINERALS = tag("other_minerals/mercury/medium"); + public static final TagKey HIGH_MERCURY_OTHER_MINERALS = tag("other_minerals/mercury/high"); + + public static TagKey tag(String id) { + return tag(Theurgy.loc(id)); + } + + public static TagKey forgeTag(String id) { + return tag(new ResourceLocation("forge", id)); + } + + public static TagKey tag(ResourceLocation id) { + return TagKey.create(Registries.ITEM, id); + } + +} diff --git a/src/main/java/com/klikli_dev/theurgy/registry/MenuTypeRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/MenuTypeRegistry.java new file mode 100644 index 000000000..c4d8e9861 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/registry/MenuTypeRegistry.java @@ -0,0 +1,17 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.registry; + +import com.klikli_dev.theurgy.Theurgy; +import net.minecraft.world.inventory.MenuType; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; + +public class MenuTypeRegistry { + public static final DeferredRegister> MENU_TYPES = DeferredRegister.create( + ForgeRegistries.MENU_TYPES, Theurgy.MODID); +} diff --git a/src/main/java/com/klikli_dev/theurgy/registry/ParticleRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/ParticleRegistry.java index 3b16396ed..eb257c5db 100644 --- a/src/main/java/com/klikli_dev/theurgy/registry/ParticleRegistry.java +++ b/src/main/java/com/klikli_dev/theurgy/registry/ParticleRegistry.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022 klikli-dev + * SPDX-FileCopyrightText: 2023 klikli-dev * * SPDX-License-Identifier: MIT */ @@ -7,10 +7,13 @@ package com.klikli_dev.theurgy.registry; import com.klikli_dev.theurgy.Theurgy; -import com.klikli_dev.theurgy.client.particle.ColorParticleTypeData; -import com.klikli_dev.theurgy.client.particle.GlowParticleData; -import com.klikli_dev.theurgy.client.particle.GlowParticleType; -import com.klikli_dev.theurgy.client.particle.ParticleColor; +import com.klikli_dev.theurgy.content.particle.ParticleColor; +import com.klikli_dev.theurgy.content.particle.coloredbubble.ColoredBubbleParticleOptions; +import com.klikli_dev.theurgy.content.particle.coloredbubble.ColoredBubbleParticleProvider; +import com.klikli_dev.theurgy.content.particle.coloredbubble.ColoredBubbleParticleType; +import com.klikli_dev.theurgy.content.particle.glow.GlowParticleOptions; +import com.klikli_dev.theurgy.content.particle.glow.GlowParticleProvider; +import com.klikli_dev.theurgy.content.particle.glow.GlowParticleType; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; import net.minecraft.core.particles.ParticleType; @@ -23,10 +26,13 @@ public class ParticleRegistry { public static final DeferredRegister> PARTICLES = DeferredRegister.create(ForgeRegistries.PARTICLE_TYPES, Theurgy.MODID); - public static final RegistryObject> GLOW_TYPE = PARTICLES.register(GlowParticleData.NAME, GlowParticleType::new); + public static final RegistryObject> GLOW_TYPE = PARTICLES.register("glow", GlowParticleType::new); + + public static final RegistryObject> COLORED_BUBBLE_TYPE = PARTICLES.register("colored_bubble", ColoredBubbleParticleType::new); public static void registerFactories(RegisterParticleProvidersEvent evt) { - evt.registerSpriteSet(GLOW_TYPE.get(), GlowParticleData::new); + evt.registerSpriteSet(GLOW_TYPE.get(), GlowParticleProvider::new); + evt.registerSpriteSet(COLORED_BUBBLE_TYPE.get(), ColoredBubbleParticleProvider::new); } public static void spawnTouch(ClientLevel world, BlockPos loc, ParticleColor particleColor) { @@ -34,7 +40,7 @@ public static void spawnTouch(ClientLevel world, BlockPos loc, ParticleColor par double d0 = loc.getX() + 0.5; double d1 = loc.getY() + 1.0; double d2 = loc.getZ() + .5; - world.addParticle(GlowParticleData.createData(particleColor), d0, d1, d2, (world.random.nextFloat() * 1 - 0.5) / 5, (world.random.nextFloat() * 1 - 0.5) / 5, (world.random.nextFloat() * 1 - 0.5) / 5); + world.addParticle(GlowParticleProvider.createOptions(particleColor), d0, d1, d2, (world.random.nextFloat() * 1 - 0.5) / 5, (world.random.nextFloat() * 1 - 0.5) / 5, (world.random.nextFloat() * 1 - 0.5) / 5); } } diff --git a/src/main/java/com/klikli_dev/theurgy/registry/RecipeRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/RecipeRegistry.java deleted file mode 100644 index 0295d169f..000000000 --- a/src/main/java/com/klikli_dev/theurgy/registry/RecipeRegistry.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2022 klikli-dev - * - * SPDX-License-Identifier: MIT - */ - -package com.klikli_dev.theurgy.registry; - -import com.klikli_dev.theurgy.Theurgy; -import com.klikli_dev.theurgy.recipe.DivinationRodRecipe; -import net.minecraft.world.item.crafting.RecipeSerializer; -import net.minecraftforge.registries.DeferredRegister; -import net.minecraftforge.registries.ForgeRegistries; -import net.minecraftforge.registries.RegistryObject; - -public class RecipeRegistry { - public static final DeferredRegister> RECIPE_SERIALIZERS = DeferredRegister.create( - ForgeRegistries.RECIPE_SERIALIZERS, Theurgy.MODID); - - public static final RegistryObject> DIVINATION_ROD = RECIPE_SERIALIZERS.register("divination_rod", - DivinationRodRecipe.Serializer::new); -} diff --git a/src/main/java/com/klikli_dev/theurgy/registry/RecipeSerializerRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/RecipeSerializerRegistry.java new file mode 100644 index 000000000..b6c2382c0 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/registry/RecipeSerializerRegistry.java @@ -0,0 +1,50 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.registry; + +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.content.recipe.*; +import com.klikli_dev.theurgy.content.recipe.ingredient.FluidIngredient; +import com.klikli_dev.theurgy.content.recipe.ingredient.FluidTagEmptyCondition; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraftforge.common.crafting.CraftingHelper; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegisterEvent; +import net.minecraftforge.registries.RegistryObject; + +public class RecipeSerializerRegistry { + public static final DeferredRegister> RECIPE_SERIALIZERS = DeferredRegister.create( + ForgeRegistries.RECIPE_SERIALIZERS, Theurgy.MODID); + + public static final RegistryObject> DIVINATION_ROD = RECIPE_SERIALIZERS.register("divination_rod", + DivinationRodRecipe.Serializer::new); + + public static final RegistryObject> CALCINATION = RECIPE_SERIALIZERS.register("calcination", + CalcinationRecipe.Serializer::new); + + public static final RegistryObject> LIQUEFACTION = RECIPE_SERIALIZERS.register("liquefaction", + LiquefactionRecipe.Serializer::new); + + public static final RegistryObject> DISTILLATION = RECIPE_SERIALIZERS.register("distillation", + DistillationRecipe.Serializer::new); + + public static final RegistryObject> INCUBATION = RECIPE_SERIALIZERS.register("incubation", + IncubationRecipe.Serializer::new); + + public static final RegistryObject> ACCUMULATION = RECIPE_SERIALIZERS.register("accumulation", + AccumulationRecipe.Serializer::new); + + public static void onRegisterRecipeSerializers(RegisterEvent event) { + //restrict to one event type otherwise it is called multiple times + if (event.getRegistryKey().equals(ForgeRegistries.Keys.RECIPE_SERIALIZERS)) { + // the actual recipe serializers are registered by the deferred register, but we register related serializers that do not have a Registry here + CraftingHelper.register(FluidTagEmptyCondition.Serializer.INSTANCE); + CraftingHelper.register(Theurgy.loc("fluid"), FluidIngredient.Serializer.INSTANCE); + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/registry/RecipeTypeRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/RecipeTypeRegistry.java new file mode 100644 index 000000000..09e03df4c --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/registry/RecipeTypeRegistry.java @@ -0,0 +1,34 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.registry; + +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.content.recipe.*; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; + +public class RecipeTypeRegistry { + public static final DeferredRegister> RECIPE_TYPES = DeferredRegister.create( + ForgeRegistries.RECIPE_TYPES, Theurgy.MODID); + public static final RegistryObject> CALCINATION = register("calcination"); + public static final RegistryObject> LIQUEFACTION = register("liquefaction"); + public static final RegistryObject> DISTILLATION = register("distillation"); + public static final RegistryObject> PYROMANTIC_BRAZIER = register("pyromantic_brazier"); + public static final RegistryObject> INCUBATION = register("incubation"); + public static final RegistryObject> ACCUMULATION = register("accumulation"); + + static > RegistryObject> register(final String id) { + return RECIPE_TYPES.register(id, () -> new RecipeType() { + public String toString() { + return id; + } + }); + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/registry/SaltRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/SaltRegistry.java new file mode 100644 index 000000000..50e88ce71 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/registry/SaltRegistry.java @@ -0,0 +1,73 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.registry; + +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.content.item.AlchemicalSaltItem; +import net.minecraft.client.Minecraft; +import net.minecraft.world.item.Item; +import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; + +import java.util.function.Supplier; + +public class SaltRegistry { + public static final DeferredRegister SALTS = DeferredRegister.create(ForgeRegistries.ITEMS, Theurgy.MODID); + + /** + * Geological term for sedimentary, rock, soil, etc. Here means Stone, Dirt, Sand, Gravel, Clay, etc + */ + public static final RegistryObject STRATA = + register("strata"); + public static final RegistryObject MINERAL = + register("mineral"); + + public static final RegistryObject CROPS = + register("crops"); + + public static RegistryObject register(String name) { + return register(name, () -> new AlchemicalSaltItem(new Item.Properties())); + } + + public static RegistryObject register(String name, Supplier sup) { + return SALTS.register("alchemical_salt_" + name, sup); + } + + /** + * We add only those salts that have a recipe to the creative tab. + * Other salts are registered, but should not be shown to players, as the related items are from mods that are not loaded + */ + public static void onBuildCreativeModTabs(BuildCreativeModeTabContentsEvent event) { + if (event.getTab() == CreativeModeTabRegistry.THEURGY.get()) { + //event will only be called client side, but other SaltRegistry calls can come from the server, so we need to guard against dist + DistHelper.onBuildCreativeModTabs(event); + } + } + + public static class DistHelper { + public static void onBuildCreativeModTabs(BuildCreativeModeTabContentsEvent event) { + var level = Minecraft.getInstance().level; + if (level == null) { + return; + } + + var recipeManager = level.getRecipeManager(); + var calcinationRecipes = recipeManager.getAllRecipesFor(RecipeTypeRegistry.CALCINATION.get()); + + SALTS.getEntries().stream() + .map(RegistryObject::get) + .forEach(sulfur -> { + calcinationRecipes.stream() + .filter(recipe -> recipe.getResultItem(level.registryAccess()) != null && recipe.getResultItem(level.registryAccess()).getItem() == sulfur) + .forEach(recipe -> event.accept(recipe.getResultItem(level.registryAccess()).copyWithCount(1))); + }); + } + } + +} diff --git a/src/main/java/com/klikli_dev/theurgy/registry/SoundRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/SoundRegistry.java index 807775100..524f6c7fb 100644 --- a/src/main/java/com/klikli_dev/theurgy/registry/SoundRegistry.java +++ b/src/main/java/com/klikli_dev/theurgy/registry/SoundRegistry.java @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2022 klikli-dev + * SPDX-FileCopyrightText: 2023 klikli-dev * * SPDX-License-Identifier: MIT */ diff --git a/src/main/java/com/klikli_dev/theurgy/registry/SulfurRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/SulfurRegistry.java new file mode 100644 index 000000000..ae7e6c7d8 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/registry/SulfurRegistry.java @@ -0,0 +1,119 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.registry; + +import com.klikli_dev.theurgy.Theurgy; +import com.klikli_dev.theurgy.content.item.AlchemicalSulfurItem; +import net.minecraft.client.Minecraft; +import net.minecraft.world.item.Item; +import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; + +import java.util.function.Supplier; + +public class SulfurRegistry { + public static final DeferredRegister SULFURS = DeferredRegister.create(ForgeRegistries.ITEMS, Theurgy.MODID); + + public static final RegistryObject LOGS = registerWithTagSourceNameOverride("logs"); + + //Crops + public static final RegistryObject WHEAT = registerDefault("wheat"); + + + //Common Metals + public static final RegistryObject IRON = registerWithSourceNameOverride("iron"); + public static final RegistryObject COPPER = registerWithSourceNameOverride("copper"); + + public static final RegistryObject SILVER = registerWithSourceNameOverride("silver"); + + public static final RegistryObject GOLD = registerWithSourceNameOverride("gold"); + + public static final RegistryObject NETHERITE = registerWithSourceNameOverride("netherite"); + public static final RegistryObject URANIUM = registerWithSourceNameOverride("uranium"); + public static final RegistryObject AZURE_SILVER = registerWithSourceNameOverride("azure_silver"); + public static final RegistryObject ZINC = registerWithSourceNameOverride("zinc"); + public static final RegistryObject OSMIUM = registerWithSourceNameOverride("osmium"); + public static final RegistryObject NICKEL = registerWithSourceNameOverride("nickel"); + public static final RegistryObject LEAD = registerWithSourceNameOverride("lead"); + public static final RegistryObject ALLTHEMODIUM = registerWithSourceNameOverride("allthemodium"); + public static final RegistryObject UNOBTAINIUM = registerWithSourceNameOverride("unobtainium"); + public static final RegistryObject IRIDIUM = registerWithSourceNameOverride("iridium"); + public static final RegistryObject TIN = registerWithSourceNameOverride("tin"); + public static final RegistryObject CINNABAR = registerWithSourceNameOverride("cinnabar"); + public static final RegistryObject CRIMSON_IRON = registerWithSourceNameOverride("crimson_iron"); + public static final RegistryObject PLATINUM = registerWithSourceNameOverride("platinum"); + public static final RegistryObject VIBRANIUM = registerWithSourceNameOverride("vibranium"); + + //Common Gems + + public static final RegistryObject DIAMOND = registerWithSourceNameOverride("diamond"); + public static final RegistryObject EMERALD = registerWithSourceNameOverride("emerald"); + public static final RegistryObject LAPIS = registerWithSourceNameOverride("lapis"); + public static final RegistryObject QUARTZ = registerWithSourceNameOverride("quartz"); + public static final RegistryObject AMETHYST = registerWithSourceNameOverride("amethyst"); + public static final RegistryObject PRISMARINE = registerWithSourceNameOverride("prismarine"); + public static final RegistryObject RUBY = registerWithSourceNameOverride("ruby"); + public static final RegistryObject APATITE = registerWithSourceNameOverride("apatite"); + public static final RegistryObject PERIDOT = registerWithSourceNameOverride("peridot"); + public static final RegistryObject FLUORITE = registerWithSourceNameOverride("fluorite"); + public static final RegistryObject SAPPHIRE = registerWithSourceNameOverride("sapphire"); + + public static final RegistryObject SAL_AMMONIAC = registerWithSourceNameOverride("sal_ammoniac"); + + //Other Common Minerals + public static final RegistryObject REDSTONE = registerWithSourceNameOverride("redstone"); + public static final RegistryObject COAL = registerDefault("coal"); + public static final RegistryObject SULFUR = registerWithSourceNameOverride("sulfur"); + + + public static RegistryObject registerWithTagSourceNameOverride(String name) { + return register(name, () -> new AlchemicalSulfurItem(new Item.Properties()).overrideTagSourceName(true)); + } + + public static RegistryObject registerWithSourceNameOverride(String name) { + return register(name, () -> new AlchemicalSulfurItem(new Item.Properties()).overrideSourceName(true)); + } + + public static RegistryObject registerDefault(String name) { + return register(name, () -> new AlchemicalSulfurItem(new Item.Properties())); + } + + public static RegistryObject register(String name, Supplier sup) { + return SULFURS.register("alchemical_sulfur_" + name, sup); + } + + + /** + * We add only those sulfurs that have a recipe to the creative tab. + * Other sulfurs are registered, but should not be shown to players, as the related items are from mods that are not loaded + */ + public static void onBuildCreativeModTabs(BuildCreativeModeTabContentsEvent event) { + if (event.getTab() == CreativeModeTabRegistry.THEURGY.get()) { + //event will only be called client side, but other SulfurRegistry calls can come from the server, so we need to guard against dist + DistHelper.onBuildCreativeModTabs(event); + } + } + + public static class DistHelper { + public static void onBuildCreativeModTabs(BuildCreativeModeTabContentsEvent event) { + var level = Minecraft.getInstance().level; + if (level == null) { + return; + } + + var recipeManager = level.getRecipeManager(); + var liquefactionRecipes = recipeManager.getAllRecipesFor(RecipeTypeRegistry.LIQUEFACTION.get()); + + SULFURS.getEntries().stream().map(RegistryObject::get).map(AlchemicalSulfurItem.class::cast).forEach(sulfur -> { + liquefactionRecipes.stream().filter(recipe -> recipe.getResultItem(level.registryAccess()) != null && recipe.getResultItem(level.registryAccess()).getItem() == sulfur).forEach(recipe -> event.accept(recipe.getResultItem(level.registryAccess()).copyWithCount(1))); + }); + } + } + +} diff --git a/src/main/java/com/klikli_dev/theurgy/registry/TagRegistry.java b/src/main/java/com/klikli_dev/theurgy/registry/TagRegistry.java deleted file mode 100644 index b1991d58a..000000000 --- a/src/main/java/com/klikli_dev/theurgy/registry/TagRegistry.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * SPDX-FileCopyrightText: 2022 klikli-dev - * - * SPDX-License-Identifier: MIT - */ - -package com.klikli_dev.theurgy.registry; - -import com.klikli_dev.theurgy.Theurgy; -import net.minecraft.core.Registry; -import net.minecraft.core.registries.Registries; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.tags.TagKey; -import net.minecraft.world.level.block.Block; - -public class TagRegistry { - - public static final TagKey DIVINATION_ROD_T1_ALLOWED_BLOCKS = makeBlockTag( "divination_rod_t1_allowed_blocks"); - public static final TagKey DIVINATION_ROD_T2_ALLOWED_BLOCKS = makeBlockTag( "divination_rod_t2_allowed_blocks"); - public static final TagKey DIVINATION_ROD_T3_ALLOWED_BLOCKS = makeBlockTag( "divination_rod_t3_allowed_blocks"); - public static final TagKey DIVINATION_ROD_T4_ALLOWED_BLOCKS = makeBlockTag( "divination_rod_t4_allowed_blocks"); - - public static final TagKey DIVINATION_ROD_T1_DISALLOWED_BLOCKS = makeBlockTag( "divination_rod_t1_disallowed_blocks"); - public static final TagKey DIVINATION_ROD_T2_DISALLOWED_BLOCKS = makeBlockTag( "divination_rod_t2_disallowed_blocks"); - public static final TagKey DIVINATION_ROD_T3_DISALLOWED_BLOCKS = makeBlockTag( "divination_rod_t3_disallowed_blocks"); - public static final TagKey DIVINATION_ROD_T4_DISALLOWED_BLOCKS = makeBlockTag( "divination_rod_t4_disallowed_blocks"); - - public static TagKey makeBlockTag(String id) { - return makeBlockTag(Theurgy.loc(id)); - } - - public static TagKey makeBlockTag(ResourceLocation id) { - return TagKey.create(Registries.BLOCK, id); - } -} diff --git a/src/main/java/com/klikli_dev/theurgy/client/scanner/ScanManager.java b/src/main/java/com/klikli_dev/theurgy/scanner/ScanManager.java similarity index 95% rename from src/main/java/com/klikli_dev/theurgy/client/scanner/ScanManager.java rename to src/main/java/com/klikli_dev/theurgy/scanner/ScanManager.java index 31dd6b1bc..52a56fa88 100644 --- a/src/main/java/com/klikli_dev/theurgy/client/scanner/ScanManager.java +++ b/src/main/java/com/klikli_dev/theurgy/scanner/ScanManager.java @@ -1,10 +1,10 @@ /* - * SPDX-FileCopyrightText: 2022 klikli-dev + * SPDX-FileCopyrightText: 2023 klikli-dev * * SPDX-License-Identifier: MIT */ -package com.klikli_dev.theurgy.client.scanner; +package com.klikli_dev.theurgy.scanner; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.player.Player; diff --git a/src/main/java/com/klikli_dev/theurgy/client/scanner/Scanner.java b/src/main/java/com/klikli_dev/theurgy/scanner/Scanner.java similarity index 95% rename from src/main/java/com/klikli_dev/theurgy/client/scanner/Scanner.java rename to src/main/java/com/klikli_dev/theurgy/scanner/Scanner.java index 6529ec4fe..1166cdd13 100644 --- a/src/main/java/com/klikli_dev/theurgy/client/scanner/Scanner.java +++ b/src/main/java/com/klikli_dev/theurgy/scanner/Scanner.java @@ -1,10 +1,10 @@ /* - * SPDX-FileCopyrightText: 2022 klikli-dev + * SPDX-FileCopyrightText: 2023 klikli-dev * * SPDX-License-Identifier: MIT */ -package com.klikli_dev.theurgy.client.scanner; +package com.klikli_dev.theurgy.scanner; import net.minecraft.core.BlockPos; import net.minecraft.util.Mth; @@ -53,7 +53,7 @@ public void initialize(Player player, Vec3 center, float radius, int totalTicks) this.center = center; this.radius = radius; this.radiusSquared = this.radius * this.radius; - this.min = BlockPos.containing(center).offset(-Mth.ceil(this.radius), Mth.ceil(-this.radius), Mth.ceil(-this.radius)); + this.min = BlockPos.containing(center).offset(Mth.ceil(-this.radius), Mth.ceil(-this.radius), Mth.ceil(-this.radius)); this.max = BlockPos.containing(center).offset(Mth.ceil(this.radius), Mth.ceil(this.radius), Mth.ceil(this.radius)); this.x = this.min.getX(); this.y = this.min.getY() - 1;//first move next increments this to min.getY(); diff --git a/src/main/java/com/klikli_dev/theurgy/tooltips/TooltipHandler.java b/src/main/java/com/klikli_dev/theurgy/tooltips/TooltipHandler.java index 034aa2699..98e147f31 100644 --- a/src/main/java/com/klikli_dev/theurgy/tooltips/TooltipHandler.java +++ b/src/main/java/com/klikli_dev/theurgy/tooltips/TooltipHandler.java @@ -29,6 +29,7 @@ public class TooltipHandler { private static final List namespacesToListenFor = new ArrayList<>(); public static void onItemTooltipEvent(ItemTooltipEvent event) { + //Note to handle fluid stacks in JEI we'd need RenderTooltipEvent (probably .Pre) ItemStack stack = event.getItemStack(); var itemId = ForgeRegistries.ITEMS.getKey(stack.getItem()); @@ -48,18 +49,28 @@ public static void onItemTooltipEvent(ItemTooltipEvent event) { event.getToolTip().add(Component.translatable(tooltipKey, additionalTooltipData.toArray()).withStyle(Style.EMPTY.withColor(ChatFormatting.GRAY))); } + //The (conditional) literal " "'s are a hack to add newlines between the additional tooltips headings/"show ..." hints and the text. + //These newlines are conditional because e.g. they should not appear if there are just two "show ..." hints after each other if (extendedTooltipExists) { - if(Screen.hasShiftDown()){ + if (Screen.hasShiftDown()) { + event.getToolTip().add(Component.literal(" ")); + event.getToolTip().add(Component.translatable(TheurgyConstants.I18n.Tooltip.EXTENDED_HEADING, additionalTooltipData.toArray())); event.getToolTip().add(Component.translatable(extendedTooltipKey, additionalTooltipData.toArray()).withStyle(Style.EMPTY.withColor(ChatFormatting.GRAY))); } else { + event.getToolTip().add(Component.literal(" ")); event.getToolTip().add(Component.translatable(TheurgyConstants.I18n.Tooltip.SHOW_EXTENDED, additionalTooltipData.toArray())); } } if (usageTooltipExists) { - if(Screen.hasControlDown()){ + if (Screen.hasControlDown()) { + if (!extendedTooltipExists || Screen.hasShiftDown()) + event.getToolTip().add(Component.literal(" ")); + event.getToolTip().add(Component.translatable(TheurgyConstants.I18n.Tooltip.USAGE_HEADING, additionalTooltipData.toArray())); event.getToolTip().add(Component.translatable(usageTooltipKey, additionalTooltipData.toArray()).withStyle(Style.EMPTY.withColor(ChatFormatting.GRAY))); } else { + if (!extendedTooltipExists || Screen.hasShiftDown()) + event.getToolTip().add(Component.literal(" ")); event.getToolTip().add(Component.translatable(TheurgyConstants.I18n.Tooltip.SHOW_USAGE, additionalTooltipData.toArray())); } } diff --git a/src/main/java/com/klikli_dev/theurgy/util/LevelUtil.java b/src/main/java/com/klikli_dev/theurgy/util/LevelUtil.java new file mode 100644 index 000000000..b83ac7e1c --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/util/LevelUtil.java @@ -0,0 +1,40 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.util; + +import net.minecraft.client.Minecraft; +import net.minecraft.world.level.Level; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.fml.loading.FMLLoader; +import net.minecraftforge.server.ServerLifecycleHooks; + +public class LevelUtil { + + /** + * Attempts to get a level if there is no context. + * This is generally needed if items want to access recipes but are not provided a world context. + * Very hacky, do not use unless absolutely necessary. + */ + public static Level getLevelWithoutContext() { + + if (FMLLoader.getDist() == Dist.CLIENT) { + return DistHelper.getClientLevel(); + } + return getOverworldServerLevel(); + } + + private static Level getOverworldServerLevel() { + var server = ServerLifecycleHooks.getCurrentServer(); + return server == null ? null : server.getLevel(Level.OVERWORLD); + } + + private static class DistHelper { + private static Level getClientLevel() { + return Minecraft.getInstance().level; + } + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/util/TagUtil.java b/src/main/java/com/klikli_dev/theurgy/util/TagUtil.java new file mode 100644 index 000000000..b88450b09 --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/util/TagUtil.java @@ -0,0 +1,29 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.util; + +import com.klikli_dev.theurgy.integration.almostunified.AlmostUnifiedIntegration; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.Nullable; + +public class TagUtil { + + @Nullable + public static Item getItemForTag(TagKey tag) { + var item = AlmostUnifiedIntegration.getPreferredItemForTag(tag); + + return item != null ? item : ForgeRegistries.ITEMS.tags().getTag(tag).stream().findFirst().orElse(null); + } + + public static ItemStack getItemStackForTag(TagKey tag) { + var item = getItemForTag(tag); + return item != null ? new ItemStack(item) : ItemStack.EMPTY; + } +} diff --git a/src/main/java/com/klikli_dev/theurgy/util/TheurgyExtraCodecs.java b/src/main/java/com/klikli_dev/theurgy/util/TheurgyExtraCodecs.java new file mode 100644 index 000000000..f6998419f --- /dev/null +++ b/src/main/java/com/klikli_dev/theurgy/util/TheurgyExtraCodecs.java @@ -0,0 +1,33 @@ +/* + * SPDX-FileCopyrightText: 2023 klikli-dev + * + * SPDX-License-Identifier: MIT + */ + +package com.klikli_dev.theurgy.util; + +import com.google.gson.JsonParseException; +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; +import com.mojang.serialization.DynamicOps; +import com.mojang.serialization.JsonOps; +import com.mojang.serialization.codecs.PrimitiveCodec; +import net.minecraft.world.item.crafting.Ingredient; + +public class TheurgyExtraCodecs { + public static final Codec INGREDIENT = new PrimitiveCodec<>() { + @Override + public DataResult read(DynamicOps ops, T input) { + try { + return DataResult.success(Ingredient.fromJson(ops.convertTo(JsonOps.INSTANCE, input))); + } catch (JsonParseException e) { + return DataResult.error(() -> "Failed to parse Ingredient: " + e.getMessage()); + } + } + + @Override + public T write(DynamicOps ops, Ingredient value) { + return JsonOps.INSTANCE.convertTo(ops, value.toJson()); + } + }; +} diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index bdba50eea..fcdd74b91 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -1 +1,7 @@ -public-f net.minecraft.world.entity.Entity m_142467_(Lnet/minecraft/world/entity/Entity$RemovalReason;)V # setRemoved \ No newline at end of file +public-f net.minecraft.world.entity.Entity m_142467_(Lnet/minecraft/world/entity/Entity$RemovalReason;)V # setRemoved +public net.minecraft.world.item.crafting.SimpleCookingSerializer$CookieBaker +public net.minecraft.data.loot.BlockLootSubProvider f_244441_ # map +public net.minecraft.world.item.crafting.RecipeManager m_44054_(Lnet/minecraft/world/item/crafting/RecipeType;)Ljava/util/Map; # byType +public net.minecraft.world.item.crafting.Ingredient f_43902_ # values +public net.minecraft.world.item.crafting.Ingredient$TagValue f_43959_ # tag +public net.minecraft.world.level.block.DoublePlantBlock m_52903_(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/entity/player/Player;)V # preventCreativeDropFromBottomPart \ No newline at end of file diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 61be42084..fced5a69b 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -45,6 +45,18 @@ mandatory = true versionRange = "${modonomicon_version_range}" side = "BOTH" +[[dependencies.theurgy]] +modId = "almostunified" +mandatory = false +versionRange = "${almost_unified_version_range}" +side = "BOTH" + +[[dependencies.theurgy]] +modId = "geckolib" +mandatory = true +versionRange = "${geckolib_version_range}" +side = "BOTH" + [[dependencies.theurgy]] modId = "jei" mandatory = false diff --git a/src/main/resources/assets/theurgy/animations/calcination_oven.animation.json b/src/main/resources/assets/theurgy/animations/calcination_oven.animation.json new file mode 100644 index 000000000..8221df9f3 --- /dev/null +++ b/src/main/resources/assets/theurgy/animations/calcination_oven.animation.json @@ -0,0 +1,987 @@ +{ + "format_version": "1.8.0", + "animations": { + "animation.calcination_oven.orig": { + "animation_length": 3, + "bones": { + "body": { + "scale": { + "0.0": { + "vector": [1, 0.1, 1] + }, + "0.5": { + "vector": [1, 1, 1], + "easing": "easeInOutQuint" + } + } + }, + "ringOne": { + "scale": { + "0.0": { + "vector": [0, 1, 0] + }, + "1.25": { + "vector": [0, 1, 0] + }, + "1.75": { + "vector": [1, 1, 1], + "easing": "easeInOutQuint" + } + } + }, + "ringTwo": { + "scale": { + "0.0": { + "vector": [0, 1, 0] + }, + "1.25": { + "vector": [0, 1, 0] + }, + "1.75": { + "vector": [1, 1, 1], + "easing": "easeInOutQuint" + } + } + }, + "glow": { + "scale": { + "0.0": { + "vector": [0, 1, 0] + }, + "1.5": { + "vector": [0, 1, 0] + }, + "2.0": { + "vector": [1, 1, 1], + "easing": "easeInOutQuint" + } + } + }, + "topGlow": { + "position": { + "0.0": { + "vector": [0, -18, 0] + }, + "1.0": { + "vector": [0, 0, 0], + "easing": "easeInOutQuint" + } + } + }, + "top": { + "position": { + "0.0": { + "vector": [0, -19, 0] + }, + "1.0": { + "vector": [0, 0, 0], + "easing": "easeInOutQuint" + } + } + }, + "bottom1": { + "rotation": { + "1.0": { + "vector": [0, 0, -45] + }, + "1.5": { + "vector": [0, 0, 0], + "easing": "easeInOutQuint" + } + }, + "scale": { + "0.0": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [1, 1, 1], + "easing": "easeInOutQuart" + } + } + }, + "bottom2": { + "rotation": { + "1.0": { + "vector": [0, 0, 45] + }, + "1.5": { + "vector": [0, 0, 0], + "easing": "easeInOutQuint" + } + }, + "scale": { + "0.0": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [1, 1, 1], + "easing": "easeInOutQuart" + } + } + }, + "bottom3": { + "rotation": { + "1.0": { + "vector": [-45, 0, 0] + }, + "1.5": { + "vector": [0, 0, 0], + "easing": "easeInOutQuint" + } + }, + "scale": { + "0.0": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [1, 1, 1], + "easing": "easeInOutQuart" + } + } + }, + "bottom4": { + "rotation": { + "1.0": { + "vector": [45, 0, 0] + }, + "1.5": { + "vector": [0, 0, 0], + "easing": "easeInOutQuint" + } + }, + "scale": { + "0.0": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [1, 1, 1], + "easing": "easeInOutQuart" + } + } + }, + "topSlanted1": { + "rotation": { + "0.0": { + "vector": [-45, 0, 0] + }, + "1.25": { + "vector": [-45, 0, 0] + }, + "1.5": { + "vector": [-90, 0, 0], + "easing": "easeInOutQuint" + } + }, + "scale": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.5": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [1, 1, 1], + "easing": "easeInOutQuint" + } + } + }, + "topSlanted2": { + "rotation": { + "0.0": { + "vector": [0, 0, -45] + }, + "1.25": { + "vector": [0, 0, -45] + }, + "1.5": { + "vector": [0, 0, -90], + "easing": "easeInOutQuint" + } + }, + "scale": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.5": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [1, 1, 1], + "easing": "easeInOutQuint" + } + } + }, + "topSlanted3": { + "rotation": { + "0.0": { + "vector": [0, 0, 45] + }, + "1.25": { + "vector": [0, 0, 45] + }, + "1.5": { + "vector": [0, 0, 90], + "easing": "easeInOutQuint" + } + }, + "scale": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.5": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [1, 1, 1], + "easing": "easeInOutQuint" + } + } + }, + "topSlanted4": { + "rotation": { + "0.0": { + "vector": [45, 0, 0] + }, + "1.25": { + "vector": [45, 0, 0] + }, + "1.5": { + "vector": [90, 0, 0], + "easing": "easeInOutQuint" + } + }, + "scale": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.5": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [1, 1, 1], + "easing": "easeInOutQuint" + } + } + } + } + }, + "animation.calcination_oven.place": { + "animation_length": 3, + "bones": { + "body": { + "scale": { + "0.0": { + "vector": [1, 0.1, 1] + }, + "0.5": { + "vector": [1, 1, 1], + "easing": "easeInOutQuint" + } + } + }, + "ringOne": { + "scale": { + "0.0": { + "vector": [0, 1, 0] + }, + "1.25": { + "vector": [0, 1, 0] + } + } + }, + "ringTwo": { + "scale": { + "0.0": { + "vector": [0, 1, 0] + }, + "1.25": { + "vector": [0, 1, 0] + } + } + }, + "glow": { + "scale": { + "0.0": { + "vector": [0, 1, 0] + }, + "1.5": { + "vector": [0, 1, 0] + } + } + }, + "topGlow": { + "position": { + "0.0": { + "vector": [0, -18, 0] + }, + "1.0": { + "vector": [0, 0, 0], + "easing": "easeInOutQuint" + } + } + }, + "top": { + "position": { + "0.0": { + "vector": [0, -19, 0] + }, + "1.0": { + "vector": [0, 0, 0], + "easing": "easeInOutQuint" + } + } + }, + "bottom1": { + "rotation": { + "1.0": { + "vector": [0, 0, -45] + }, + "1.5": { + "vector": [0, 0, 0], + "easing": "easeInOutQuint" + } + }, + "scale": { + "0.0": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [1, 1, 1], + "easing": "easeInOutQuart" + } + } + }, + "bottom2": { + "rotation": { + "1.0": { + "vector": [0, 0, 45] + }, + "1.5": { + "vector": [0, 0, 0], + "easing": "easeInOutQuint" + } + }, + "scale": { + "0.0": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [1, 1, 1], + "easing": "easeInOutQuart" + } + } + }, + "bottom3": { + "rotation": { + "1.0": { + "vector": [-45, 0, 0] + }, + "1.5": { + "vector": [0, 0, 0], + "easing": "easeInOutQuint" + } + }, + "scale": { + "0.0": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [1, 1, 1], + "easing": "easeInOutQuart" + } + } + }, + "bottom4": { + "rotation": { + "1.0": { + "vector": [45, 0, 0] + }, + "1.5": { + "vector": [0, 0, 0], + "easing": "easeInOutQuint" + } + }, + "scale": { + "0.0": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [1, 1, 1], + "easing": "easeInOutQuart" + } + } + }, + "topSlanted1": { + "rotation": { + "0.0": { + "vector": [-45, 0, 0] + }, + "1.25": { + "vector": [-45, 0, 0] + }, + "1.5": { + "vector": [-90, 0, 0], + "easing": "easeInOutQuint" + } + }, + "scale": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.5": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [1, 1, 1], + "easing": "easeInOutQuint" + } + } + }, + "topSlanted2": { + "rotation": { + "0.0": { + "vector": [0, 0, -45] + }, + "1.25": { + "vector": [0, 0, -45] + }, + "1.5": { + "vector": [0, 0, -90], + "easing": "easeInOutQuint" + } + }, + "scale": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.5": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [1, 1, 1], + "easing": "easeInOutQuint" + } + } + }, + "topSlanted3": { + "rotation": { + "0.0": { + "vector": [0, 0, 45] + }, + "1.25": { + "vector": [0, 0, 45] + }, + "1.5": { + "vector": [0, 0, 90], + "easing": "easeInOutQuint" + } + }, + "scale": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.5": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [1, 1, 1], + "easing": "easeInOutQuint" + } + } + }, + "topSlanted4": { + "rotation": { + "0.0": { + "vector": [45, 0, 0] + }, + "1.25": { + "vector": [45, 0, 0] + }, + "1.5": { + "vector": [90, 0, 0], + "easing": "easeInOutQuint" + } + }, + "scale": { + "0.0": { + "vector": [0, 0, 0] + }, + "0.5": { + "vector": [0, 0, 0] + }, + "1.0": { + "vector": [1, 1, 1], + "easing": "easeInOutQuint" + } + } + } + } + }, + "animation.calcination_oven.start": { + "animation_length": 1, + "bones": { + "body": { + "scale": { + "vector": [1, 1, 1] + } + }, + "ringOne": { + "scale": { + "0.0": { + "vector": [0, 1, 0] + }, + "0.25": { + "vector": [0, 1, 0] + }, + "0.75": { + "vector": [1, 1, 1], + "easing": "easeInOutQuint" + } + } + }, + "ringTwo": { + "scale": { + "0.0": { + "vector": [0, 1, 0] + }, + "0.25": { + "vector": [0, 1, 0] + }, + "0.75": { + "vector": [1, 1, 1], + "easing": "easeInOutQuint" + } + } + }, + "glow": { + "scale": { + "0.0": { + "vector": [0, 1, 0] + }, + "0.5": { + "vector": [0, 1, 0] + }, + "1.0": { + "vector": [1, 1, 1], + "easing": "easeInOutQuint" + } + } + }, + "topGlow": { + "position": { + "vector": ["easeInOutQuint", "easeInOutQuint", "easeInOutQuint"] + } + }, + "top": { + "position": { + "vector": ["easeInOutQuint", "easeInOutQuint", "easeInOutQuint"] + } + }, + "bottom1": { + "rotation": { + "vector": ["easeInOutQuint", "easeInOutQuint", "easeInOutQuint"] + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "bottom2": { + "rotation": { + "vector": ["easeInOutQuint", "easeInOutQuint", "easeInOutQuint"] + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "bottom3": { + "rotation": { + "vector": ["easeInOutQuint", "easeInOutQuint", "easeInOutQuint"] + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "bottom4": { + "rotation": { + "vector": ["easeInOutQuint", "easeInOutQuint", "easeInOutQuint"] + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "topSlanted1": { + "rotation": { + "vector": [-90, 0, 0] + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "topSlanted2": { + "rotation": { + "vector": [0, 0, -90] + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "topSlanted3": { + "rotation": { + "vector": [0, 0, 90] + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "topSlanted4": { + "rotation": { + "vector": [90, 0, 0], + "easing": "linear" + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "base": { + "scale": { + "vector": [1, 1, 1] + } + } + } + }, + "animation.calcination_oven.stop": { + "animation_length": 1, + "bones": { + "body": { + "scale": { + "vector": [1, 1, 1] + } + }, + "ringOne": { + "scale": { + "0.0": { + "vector": [1, 1, 1] + }, + "0.75": { + "vector": [0, 1, 0], + "easing": "easeInOutQuint" + } + } + }, + "ringTwo": { + "scale": { + "0.0": { + "vector": [1, 1, 1] + }, + "0.75": { + "vector": [0, 1, 0], + "easing": "easeInOutQuint" + } + } + }, + "glow": { + "scale": { + "0.0": { + "vector": [1, 1, 1] + }, + "1.0": { + "vector": [0, 1, 0], + "easing": "easeInOutQuint" + } + } + }, + "topGlow": { + "position": { + "vector": ["easeInOutQuint", "easeInOutQuint", "easeInOutQuint"] + } + }, + "top": { + "position": { + "vector": ["easeInOutQuint", "easeInOutQuint", "easeInOutQuint"] + } + }, + "bottom1": { + "rotation": { + "vector": ["easeInOutQuint", "easeInOutQuint", "easeInOutQuint"] + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "bottom2": { + "rotation": { + "vector": ["easeInOutQuint", "easeInOutQuint", "easeInOutQuint"] + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "bottom3": { + "rotation": { + "vector": ["easeInOutQuint", "easeInOutQuint", "easeInOutQuint"] + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "bottom4": { + "rotation": { + "vector": ["easeInOutQuint", "easeInOutQuint", "easeInOutQuint"] + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "topSlanted1": { + "rotation": { + "vector": [-90, 0, 0] + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "topSlanted2": { + "rotation": { + "vector": [0, 0, -90] + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "topSlanted3": { + "rotation": { + "vector": [0, 0, 90] + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "topSlanted4": { + "rotation": { + "vector": [90, 0, 0] + }, + "scale": { + "vector": [1, 1, 1] + } + } + } + }, + "animation.calcination_oven.on": { + "loop": true, + "animation_length": 1, + "bones": { + "body": { + "scale": { + "vector": [1, 1, 1] + } + }, + "ringOne": { + "scale": { + "0.0": { + "vector": [1, 1, 1] + }, + "0.5": { + "vector": [0.9, 1, 0.9] + }, + "1.0": { + "vector": [1, 1, 1] + } + } + }, + "ringTwo": { + "scale": { + "0.0": { + "vector": [0.9, 1, 0.9] + }, + "0.5": { + "vector": [1, 1, 1], + "easing": "linear" + }, + "1.0": { + "vector": [0.9, 1, 0.9] + } + } + }, + "glow": { + "scale": { + "vector": [1, 1, 1] + } + }, + "topGlow": { + "position": { + "vector": [0, 0, 0] + } + }, + "top": { + "position": { + "vector": [0, 0, 0] + } + }, + "bottom1": { + "rotation": { + "vector": [0, 0, 0] + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "bottom2": { + "rotation": { + "vector": [0, 0, 0] + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "bottom3": { + "rotation": { + "vector": [0, 0, 0] + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "bottom4": { + "rotation": { + "vector": [0, 0, 0] + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "topSlanted1": { + "rotation": { + "vector": [-90, 0, 0] + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "topSlanted2": { + "rotation": { + "vector": [0, 0, -90] + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "topSlanted3": { + "rotation": { + "vector": [0, 0, 90] + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "topSlanted4": { + "rotation": { + "vector": [90, 0, 0] + }, + "scale": { + "vector": [1, 1, 1] + } + } + } + }, + "animation.calcination_oven.off": { + "loop": true, + "bones": { + "body": { + "scale": { + "vector": [1, 1, 1] + } + }, + "ringOne": { + "scale": { + "vector": [0, 1, 0] + } + }, + "ringTwo": { + "scale": { + "vector": [0, 1, 0] + } + }, + "glow": { + "scale": { + "vector": [0, 1, 0] + } + }, + "topGlow": { + "position": { + "vector": [0, 0, 0] + } + }, + "top": { + "position": { + "vector": [0, 0, 0] + } + }, + "bottom1": { + "rotation": { + "vector": [0, 0, 0] + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "bottom2": { + "rotation": { + "vector": [0, 0, 0] + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "bottom3": { + "rotation": { + "vector": [0, 0, 0] + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "bottom4": { + "rotation": { + "vector": [0, 0, 0] + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "topSlanted1": { + "rotation": { + "vector": [-90, 0, 0] + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "topSlanted2": { + "rotation": { + "vector": [0, 0, -90] + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "topSlanted3": { + "rotation": { + "vector": [0, 0, 90] + }, + "scale": { + "vector": [1, 1, 1] + } + }, + "topSlanted4": { + "rotation": { + "vector": [90, 0, 0] + }, + "scale": { + "vector": [1, 1, 1] + } + } + } + } + }, + "geckolib_format_version": 2 +} \ No newline at end of file diff --git a/src/main/resources/assets/theurgy/animations/distiller.animation.json b/src/main/resources/assets/theurgy/animations/distiller.animation.json new file mode 100644 index 000000000..633bb1d47 --- /dev/null +++ b/src/main/resources/assets/theurgy/animations/distiller.animation.json @@ -0,0 +1,73 @@ +{ + "format_version": "1.8.0", + "animations": { + "animation.distiller.start": { + "animation_length": 1.8, + "bones": { + "top": { + "position": { + "0.0": { + "vector": [0, -10, 0] + }, + "1.5": { + "vector": [0, 2, 0], + "easing": "easeInOutBack", + "easingArgs": [1] + }, + "1.8": { + "vector": [0, 2, 0] + } + } + } + } + }, + "animation.distiller.stop": { + "animation_length": 1.5, + "bones": { + "top": { + "position": { + "0.0": { + "vector": [0, 2, 0] + }, + "1.5": { + "vector": [0, -10, 0], + "easing": "easeInOutBack" + } + } + } + } + }, + "animation.distiller.on": { + "loop": true, + "animation_length": 2, + "bones": { + "top": { + "position": { + "0.0": { + "vector": [0, 2, 0] + }, + "1.0": { + "vector": [0, 0, 0], + "easing": "easeInOutCubic" + }, + "2.0": { + "vector": [0, 2, 0], + "easing": "easeInOutCubic" + } + } + } + } + }, + "animation.distiller.off": { + "loop": true, + "bones": { + "top": { + "position": { + "vector": [0, -10, 0] + } + } + } + } + }, + "geckolib_format_version": 2 +} \ No newline at end of file diff --git a/src/main/resources/assets/theurgy/geo/calcination_oven.geo.json b/src/main/resources/assets/theurgy/geo/calcination_oven.geo.json new file mode 100644 index 000000000..6f74ba8fd --- /dev/null +++ b/src/main/resources/assets/theurgy/geo/calcination_oven.geo.json @@ -0,0 +1,145 @@ +{ + "format_version": "1.12.0", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.calcination_oven", + "texture_width": 128, + "texture_height": 128, + "visible_bounds_width": 3, + "visible_bounds_height": 2.5, + "visible_bounds_offset": [0, 0.75, 0] + }, + "bones": [ + { + "name": "thing", + "pivot": [0, 0, 0] + }, + { + "name": "base", + "parent": "thing", + "pivot": [0, 0, 0], + "cubes": [ + {"origin": [-5, 0, -5], "size": [10, 2, 10], "uv": [32, 32]} + ] + }, + { + "name": "body", + "parent": "thing", + "pivot": [0, 0, 0], + "cubes": [ + {"origin": [-4, 2, -4], "size": [8, 13, 8], "uv": [0, 32]}, + {"origin": [-4, 15, -4], "size": [8, 2, 8], "uv": [48, 52]} + ] + }, + { + "name": "ringOne", + "parent": "thing", + "pivot": [0, 3, 0], + "cubes": [ + {"origin": [-4, 8, -7], "size": [8, 2, 14], "uv": [0, 16]}, + {"origin": [-7, 8, -4], "size": [14, 2, 8], "uv": [30, 16]} + ] + }, + { + "name": "ringTwo", + "parent": "thing", + "pivot": [0, 7, 0], + "cubes": [ + {"origin": [-7, 12, -4], "size": [14, 2, 8], "uv": [30, 0]}, + {"origin": [-4, 12, -7], "size": [8, 2, 14], "uv": [0, 0]} + ] + }, + { + "name": "glow", + "parent": "thing", + "pivot": [0, 11, 0], + "cubes": [ + {"origin": [-3, 10, -6], "size": [6, 2, 12], "uv": [20, 44]}, + {"origin": [-6, 10, -3], "size": [12, 2, 6], "uv": [44, 44]} + ] + }, + { + "name": "topGlow", + "parent": "thing", + "pivot": [0, 2, 0], + "cubes": [ + {"origin": [-2, 17, -2], "size": [4, 2, 4], "uv": [24, 32]} + ] + }, + { + "name": "top", + "parent": "thing", + "pivot": [0, 19, 0], + "cubes": [ + {"origin": [-3, 18, -3], "size": [6, 2, 6], "uv": [66, 0]} + ] + }, + { + "name": "bottom1", + "parent": "thing", + "pivot": [4, 5.41421, 0], + "cubes": [ + {"origin": [1, 3, -3], "size": [8, 4, 6], "pivot": [4, 4, 0], "rotation": [0, 0, -45], "uv": [50, 62]} + ] + }, + { + "name": "bottom2", + "parent": "thing", + "pivot": [-4, 5.41421, 0], + "cubes": [ + {"origin": [-9, 3, -3], "size": [8, 4, 6], "pivot": [-4, 4, 0], "rotation": [0, 0, 45], "uv": [62, 26]} + ] + }, + { + "name": "bottom3", + "parent": "thing", + "pivot": [0, 5.41421, -4], + "cubes": [ + {"origin": [-1.17157, 0.58579, -3], "size": [8, 4, 6], "pivot": [0, 5.41421, 0], "rotation": [-90, 45, -90], "uv": [22, 62]} + ] + }, + { + "name": "bottom4", + "parent": "thing", + "pivot": [0, 5.41421, 4], + "cubes": [ + {"origin": [-6.82843, 0.58579, -3], "size": [8, 4, 6], "pivot": [0, 5.41421, 0], "rotation": [90, 45, 90], "uv": [0, 58]} + ] + }, + { + "name": "topSlanted1", + "parent": "thing", + "pivot": [0, 13.52513, 3.06066], + "cubes": [ + {"origin": [-6.82843, 15.41421, -5], "size": [5, 4, 6], "pivot": [0, 14.58579, -2], "rotation": [-90, 45, -90], "uv": [38, 72]} + ] + }, + { + "name": "topSlanted2", + "parent": "thing", + "pivot": [-3.06066, 13.52513, 0], + "cubes": [ + {"origin": [-4.82843, 15.41421, -3], "size": [5, 4, 6], "pivot": [2, 14.58579, 0], "rotation": [0, 0, -45], "uv": [16, 72]} + ] + }, + { + "name": "topSlanted3", + "parent": "thing", + "pivot": [3.06066, 13.52513, 0], + "cubes": [ + {"origin": [-8.82843, 15.41421, -3], "size": [5, 4, 6], "pivot": [-2, 14.58579, 0], "rotation": [-180, 0, -135], "uv": [0, 68]} + ] + }, + { + "name": "topSlanted4", + "parent": "thing", + "pivot": [0, 13.52513, -3.06066], + "cubes": [ + {"origin": [-6.82843, 15.41421, -1], "size": [5, 4, 6], "pivot": [0, 14.58579, 2], "rotation": [90, -45, -90], "uv": [66, 10]} + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/theurgy/geo/distiller.geo.json b/src/main/resources/assets/theurgy/geo/distiller.geo.json new file mode 100644 index 000000000..15d755185 --- /dev/null +++ b/src/main/resources/assets/theurgy/geo/distiller.geo.json @@ -0,0 +1,80 @@ +{ + "format_version": "1.12.0", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.distiller", + "texture_width": 128, + "texture_height": 128, + "visible_bounds_width": 3, + "visible_bounds_height": 4.5, + "visible_bounds_offset": [0, 1.75, 0] + }, + "bones": [ + { + "name": "all", + "pivot": [0, 7, 0] + }, + { + "name": "base", + "parent": "all", + "pivot": [0, 0, 0], + "cubes": [ + {"origin": [-4.5, -2.67296, -3.35513], "size": [10.2, 2, 11], "pivot": [0.6, 4.17105, -0.00691], "rotation": [0, -90, 72.5], "uv": [31, 33]}, + {"origin": [-6.1, -3.18993, -7.4106], "size": [10.2, 2, 11], "pivot": [-1, 4.17105, -0.00691], "rotation": [0, -90, -72.5], "uv": [42, 0]}, + {"origin": [-5.1, -3.92296, -3.20513], "size": [10.2, 2, 11], "pivot": [0, 2.92105, -0.85691], "rotation": [72.5, 0, 0], "uv": [0, 31]}, + {"origin": [-6.6, 1.91962, 0.16437], "size": [5.45, 2, 11], "pivot": [0, 4.16962, 5.66437], "rotation": [72.5, -45, 0], "uv": [64, 13]}, + {"origin": [-8.6, -1.08038, -1.83563], "size": [5.45, 2, 11], "pivot": [-2, 6.16962, 3.66437], "rotation": [-107.5, -45, 180], "uv": [63, 35]}, + {"origin": [-1.65316, 0.55102, -4.7365], "size": [5.45, 2, 11], "pivot": [3.52892, 4.04197, 0.23839], "rotation": [72.5, 45, 0], "uv": [52, 57]}, + {"origin": [3.3375, 0.77326, -4.28601], "size": [5.45, 2, 11], "pivot": [3.52892, 4.04197, 0.23839], "rotation": [-107.5, 45, -180], "uv": [0, 59]}, + {"origin": [-5.1, -3.18993, -6.4106], "size": [10.2, 2, 11], "pivot": [0, 4.17105, 0.99309], "rotation": [-72.5, 0, 0], "uv": [33, 20]}, + {"origin": [-7, 0, -7], "size": [14, 2, 14], "uv": [0, 0]}, + {"origin": [-4.5, 7, -4.5], "size": [9, 2, 9], "uv": [27, 57]}, + {"origin": [-8, 9, -4.75], "size": [3, 2, 11], "pivot": [0, 10, -0.75], "rotation": [0, 90, 0], "uv": [0, 84]}, + {"origin": [-8, 9, -18.75], "size": [3, 2, 11], "pivot": [0, 10, -11.75], "rotation": [0, 90, 0], "uv": [38, 82]}, + {"origin": [-7, 9, -3.75], "size": [3, 2, 11], "pivot": [0, 10, 0.25], "rotation": [-180, 0, 180], "uv": [73, 48]}, + {"origin": [4, 9, -6.75], "size": [3, 2, 11], "pivot": [0, 10, 0.25], "rotation": [-180, 0, 180], "uv": [21, 80]} + ] + }, + { + "name": "top", + "parent": "all", + "pivot": [0, 7, 0], + "cubes": [ + {"origin": [-3, 15.1, -3], "size": [6, 2, 6], "uv": [73, 0]}, + {"origin": [-2, 13, -2], "size": [4, 1, 4], "uv": [27, 46]}, + {"origin": [-3, 19.75, -11.1], "size": [6, 2, 10], "pivot": [0, 19.75, -4.1], "rotation": [-67.5, 0, 0], "uv": [66, 72]}, + {"origin": [-4.5, 22, -4.75], "size": [9, 6, 9.25], "uv": [0, 44]}, + {"origin": [-4.5, 31, -4.5], "size": [9, 2.7, 9], "uv": [36, 46]}, + {"origin": [-3.5, 32, -3.5], "size": [7, 2.7, 7], "uv": [68, 26]}, + {"origin": [-2.5, 33, -2.5], "size": [5, 4.7, 5], "uv": [84, 35]}, + {"origin": [-3, 19.75, 1.1], "size": [6, 2, 10], "pivot": [0, 19.75, 4.1], "rotation": [67.5, 0, 0], "uv": [0, 72]}, + {"origin": [-3, 16.19833, -8.21545], "size": [6, 2, 10], "pivot": [0, 20.13268, 0], "rotation": [0, 90, 67.5], "uv": [22, 68]}, + {"origin": [-3, 16.19833, -1.78455], "size": [6, 2, 10], "pivot": [0, 20.13268, 0], "rotation": [0, 90, -67.5], "uv": [44, 70]}, + {"origin": [-3.5, 28, 4], "size": [7, 6, 2], "pivot": [-4.5, 29, 5], "rotation": [45, 0, 0], "uv": [85, 8]}, + {"origin": [-3.5, 28, -6], "size": [7, 6, 2], "pivot": [-4.5, 29, -5], "rotation": [-45, 0, 0], "uv": [73, 84]}, + {"origin": [-3.5, 25.08579, 1.03553], "size": [7, 6, 2], "pivot": [0, 31.12132, 0], "rotation": [0, 90, -45], "uv": [55, 84]}, + {"origin": [-3.5, 25.08579, -3.03553], "size": [7, 6, 2], "pivot": [0, 31.12132, 0], "rotation": [0, 90, 45], "uv": [84, 61]}, + {"origin": [-5.5, 25, -5.5], "size": [11, 4, 11], "uv": [0, 16]}, + {"origin": [8.5, 25, -8.5], "size": [1, 2, 4], "uv": [0, 72]}, + {"origin": [4.5, 25, -9.5], "size": [1, 2, 4], "uv": [66, 70]}, + {"origin": [4.5, 25.001, -9.5], "size": [1, 2, 4], "pivot": [7, 26, -7], "rotation": [0, 90, 0], "uv": [44, 68]}, + {"origin": [8.5, 25.001, -8.5], "size": [1, 2, 4], "pivot": [7, 26, -7], "rotation": [0, 90, 0], "uv": [63, 48]}, + {"origin": [-9.5, 25, -9.5], "size": [1, 2, 4], "uv": [62, 33]}, + {"origin": [-5.5, 25.001, -8.5], "size": [1, 2, 4], "pivot": [-7, 26, -7], "rotation": [0, 90, 0], "uv": [62, 13]}, + {"origin": [-5.5, 25, -8.5], "size": [1, 2, 4], "uv": [21, 59]}, + {"origin": [-9.5, 25.001, -9.5], "size": [1, 2, 4], "pivot": [-7, 26, -7], "rotation": [0, 90, 0], "uv": [0, 59]}, + {"origin": [-9.5, 25, 4.5], "size": [1, 2, 4], "uv": [52, 13]}, + {"origin": [-5.5, 25.001, 5.5], "size": [1, 2, 4], "pivot": [-7, 26, 7], "rotation": [0, 90, 0], "uv": [42, 0]}, + {"origin": [-5.5, 25, 5.5], "size": [1, 2, 4], "uv": [31, 33]}, + {"origin": [-9.5, 25.001, 4.5], "size": [1, 2, 4], "pivot": [-7, 26, 7], "rotation": [0, 90, 0], "uv": [33, 16]}, + {"origin": [4.5, 25, 4.5], "size": [1, 2, 4], "uv": [0, 31]}, + {"origin": [8.5, 25.001, 5.5], "size": [1, 2, 4], "pivot": [7, 26, 7], "rotation": [0, 90, 0], "uv": [0, 16]}, + {"origin": [8.5, 25, 5.5], "size": [1, 2, 4], "uv": [0, 6]}, + {"origin": [4.5, 25.001, 4.5], "size": [1, 2, 4], "pivot": [7, 26, 7], "rotation": [0, 90, 0], "uv": [0, 0]} + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/theurgy/geo/incubator_vessel.geo.json b/src/main/resources/assets/theurgy/geo/incubator_vessel.geo.json new file mode 100644 index 000000000..2f0b8f4bb --- /dev/null +++ b/src/main/resources/assets/theurgy/geo/incubator_vessel.geo.json @@ -0,0 +1,147 @@ +{ + "format_version": "1.12.0", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.unknown", + "texture_width": 128, + "texture_height": 128, + "visible_bounds_width": 3, + "visible_bounds_height": 2.5, + "visible_bounds_offset": [0, 0.75, 0] + }, + "bones": [ + { + "name": "Vessel", + "pivot": [0, 0.95, 0], + "cubes": [ + {"origin": [-7, 0, -7], "size": [14, 1, 14], "uv": [0, 15]}, + {"origin": [-11, 1, -12.5], "size": [3, 1.35, 16], "pivot": [-4.5, 1.6375, 0], "rotation": [0, -90, 0], "uv": [22, 54]}, + {"origin": [-1, 1, -12.5], "size": [3, 1.35, 16], "pivot": [-4.5, 1.6375, 0], "rotation": [0, -90, 0], "uv": [40, 14]}, + {"origin": [-6, 1, -8], "size": [3, 1.325, 16], "uv": [0, 53]}, + {"origin": [3, 1, -8], "size": [3, 1.325, 16], "uv": [32, 37]}, + {"origin": [-6.5, 1.95, -6.5], "size": [2, 4, 2], "pivot": [-4.5, 3.45, -4.5], "rotation": [15, 0, -15], "uv": [42, 15]}, + {"origin": [4.5, 1.95, -6.5], "size": [2, 4, 2], "pivot": [4.5, 3.45, -4.5], "rotation": [15, 0, 15], "uv": [42, 0]}, + {"origin": [4.5, 1.95, 4.5], "size": [2, 4, 2], "pivot": [4.5, 3.45, 4.5], "rotation": [-15, 0, 15], "uv": [0, 30]}, + {"origin": [-6.5, 1.95, 4.5], "size": [2, 4, 2], "pivot": [-4.5, 3.45, 4.5], "rotation": [-15, 0, -15], "uv": [0, 36]}, + {"origin": [-5.56095, 2.02792, -5], "size": [1, 3.15, 10], "pivot": [-5.06095, 3.67792, -1], "rotation": [0, 0, -18], "uv": [60, 44]}, + {"origin": [4.56095, 2.02792, -5], "size": [1, 3.15, 10], "pivot": [5.06095, 3.67792, -1], "rotation": [0, 0, 18], "uv": [56, 57]}, + {"origin": [-5.2912, 3.58835, -5], "size": [1, 3.15, 10], "pivot": [0, 3.60659, 0], "rotation": [-90, 72, -90], "uv": [54, 31]}, + {"origin": [4.2912, 3.58835, -5], "size": [1, 3.15, 10], "pivot": [0, 3.60659, 0], "rotation": [90, 72, 90], "uv": [44, 54]}, + {"origin": [-6, 4.95, -6], "size": [12, 11, 12], "uv": [0, 30]}, + { + "origin": [-11.75, 6.95, -0.75], + "size": [12, 2, 0.5], + "pivot": [-6.25, 7.95, -0.5], + "rotation": [0, -90, 0], + "uv": { + "north": {"uv": [36, 35], "uv_size": [12, 2]}, + "east": {"uv": [36, 35], "uv_size": [0, 2]}, + "south": {"uv": [48, 35], "uv_size": [12, 2]}, + "west": {"uv": [48, 35], "uv_size": [0, 2]}, + "up": {"uv": [36, 38], "uv_size": [12, 1]}, + "down": {"uv": [36, 38], "uv_size": [12, -1]} + } + }, + { + "origin": [-11.75, 6.95, -13.25], + "size": [12, 2, 0.5], + "pivot": [-6.25, 7.95, -0.5], + "rotation": [0, -90, 0], + "uv": { + "north": {"uv": [66, 31], "uv_size": [12, 2]}, + "east": {"uv": [66, 33], "uv_size": [1, 2]}, + "south": {"uv": [67, 33], "uv_size": [12, 2]}, + "west": {"uv": [79, 31], "uv_size": [-1, 2]}, + "up": {"uv": [66, 36], "uv_size": [12, 1]}, + "down": {"uv": [66, 36], "uv_size": [12, -1]} + } + }, + { + "origin": [-7.75, 8.95, -13.25], + "size": [4, 2, 0.5], + "pivot": [-6.25, 7.95, -0.5], + "rotation": [0, -90, 0], + "uv": { + "north": {"uv": [0, 55], "uv_size": [4, 2]}, + "east": {"uv": [8, 55], "uv_size": [1, 2]}, + "south": {"uv": [4, 55], "uv_size": [4, 2]}, + "west": {"uv": [9, 55], "uv_size": [1, 2]}, + "up": {"uv": [0, 54], "uv_size": [4, 1]}, + "down": {"uv": [4, 54], "uv_size": [4, 1]} + } + }, + { + "origin": [10.5, 8.95, 3.5], + "size": [4, 2, 0.5], + "pivot": [6.25, 9.95, 5], + "rotation": [0, 180, 0], + "uv": { + "north": {"uv": [0, 59], "uv_size": [4, 2]}, + "east": {"uv": [8, 59], "uv_size": [1, 2]}, + "south": {"uv": [4, 59], "uv_size": [4, 2]}, + "west": {"uv": [10, 59], "uv_size": [-1, 2]}, + "up": {"uv": [0, 58], "uv_size": [4, 1]}, + "down": {"uv": [4, 58], "uv_size": [4, 1]} + } + }, + { + "origin": [-2, 8.95, -6.5], + "size": [4, 2, 0.5], + "uv": { + "north": {"uv": [0, 59], "uv_size": [4, 2]}, + "east": {"uv": [8, 59], "uv_size": [1, 2]}, + "south": {"uv": [4, 59], "uv_size": [4, 2]}, + "west": {"uv": [10, 59], "uv_size": [-1, 2]}, + "up": {"uv": [0, 58], "uv_size": [4, 1]}, + "down": {"uv": [4, 58], "uv_size": [4, 1]} + } + }, + { + "origin": [-7.75, 8.95, -0.75], + "size": [4, 2, 0.5], + "pivot": [-6.25, 7.95, -0.5], + "rotation": [0, -90, 0], + "uv": { + "north": {"uv": [0, 12], "uv_size": [4, 2]}, + "east": {"uv": [13, 12], "uv_size": [1, 2]}, + "south": {"uv": [4, 12], "uv_size": [4, 2]}, + "west": {"uv": [12, 12], "uv_size": [1, 2]}, + "up": {"uv": [8, 13], "uv_size": [4, -1]}, + "down": {"uv": [4, 12], "uv_size": [4, 0]} + } + }, + { + "origin": [-6.5, 6.95, 6], + "size": [13, 2, 0.5], + "uv": { + "north": {"uv": [85, 25], "uv_size": [-14, 2]}, + "east": {"uv": [86, 25], "uv_size": [1, 2]}, + "south": {"uv": [84.5, 27], "uv_size": [-13, 2]}, + "west": {"uv": [70, 25], "uv_size": [-1, 2]}, + "up": {"uv": [84.5, 30], "uv_size": [-13, -1]}, + "down": {"uv": [84.5, 24], "uv_size": [-13, 1]} + } + }, + { + "origin": [-6.5, 6.95, -15.5], + "size": [13, 2, 0.5], + "pivot": [0, 7.95, -10.75], + "rotation": [0, 180, 0], + "uv": { + "north": {"uv": [85, 25], "uv_size": [-14, 2]}, + "east": {"uv": [86, 25], "uv_size": [1, 2]}, + "south": {"uv": [84.5, 27], "uv_size": [-13, 2]}, + "west": {"uv": [70, 25], "uv_size": [-1, 2]}, + "up": {"uv": [84.5, 30], "uv_size": [-13, -1]}, + "down": {"uv": [84.5, 24], "uv_size": [-13, 1]} + } + }, + {"origin": [-7, 15.95, -7], "size": [14, 1, 14], "uv": [0, 0]}, + {"origin": [-3, 16.95, -3], "size": [6, 1, 6], "uv": [62, 13]} + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/theurgy/geo/sal_ammoniac_tank.geo.json b/src/main/resources/assets/theurgy/geo/sal_ammoniac_tank.geo.json new file mode 100644 index 000000000..e2315d0e2 --- /dev/null +++ b/src/main/resources/assets/theurgy/geo/sal_ammoniac_tank.geo.json @@ -0,0 +1,167 @@ +{ + "format_version": "1.12.0", + "minecraft:geometry": [ + { + "description": { + "identifier": "geometry.unknown", + "texture_width": 128, + "texture_height": 128, + "visible_bounds_width": 2, + "visible_bounds_height": 2.5, + "visible_bounds_offset": [0, 0.75, 0] + }, + "bones": [ + { + "name": "bb_main", + "pivot": [0, 0, 0], + "cubes": [ + {"origin": [-8, 0, -8], "size": [2, 15, 2], "uv": [52, 55]}, + {"origin": [-6, 2, -6], "size": [12, 9, 12], "uv": [0, 0]}, + {"origin": [-6, 3, -7], "size": [12, 2, 1], "uv": [0, 46]}, + {"origin": [-6, 3, 6], "size": [12, 2, 1], "uv": [36, 6]}, + {"origin": [-6, 3, 6], "size": [12, 2, 1], "pivot": [0, 4, 0], "rotation": [0, -90, 0], "uv": [36, 0]}, + {"origin": [-6, 3, -7], "size": [12, 2, 1], "pivot": [0, 4, 0], "rotation": [0, -90, 0], "uv": [36, 3]}, + {"origin": [-5, 0, -5], "size": [10, 2, 10], "uv": [0, 34]}, + { + "origin": [-4, 11, -4], + "size": [8, 3, 1], + "uv": { + "north": {"uv": [38, 41], "uv_size": [8, 3]}, + "east": {"uv": [37, 41], "uv_size": [1, 3]}, + "south": {"uv": [64, 32], "uv_size": [8, 3]}, + "west": {"uv": [46, 41], "uv_size": [1, 3]}, + "up": {"uv": [58, 37], "uv_size": [8, 1]}, + "down": {"uv": [46, 41], "uv_size": [8, -1]} + } + }, + { + "origin": [-4, 11, 3], + "size": [8, 3, 1], + "pivot": [0, 12, 3.5], + "rotation": [0, 180, 0], + "uv": { + "north": {"uv": [38, 41], "uv_size": [8, 3]}, + "east": {"uv": [37, 41], "uv_size": [1, 3]}, + "south": {"uv": [64, 26], "uv_size": [8, 3]}, + "west": {"uv": [46, 41], "uv_size": [1, 3]}, + "up": {"uv": [44, 37], "uv_size": [8, 1]}, + "down": {"uv": [46, 41], "uv_size": [8, -1]} + } + }, + { + "origin": [-3, 11, -4], + "size": [6, 3, 1], + "pivot": [0, 12.5, 0], + "rotation": [0, 90, 0], + "uv": { + "north": {"uv": [38, 41], "uv_size": [6, 3]}, + "east": {"uv": [37, 41], "uv_size": [1, 3]}, + "south": {"uv": [64, 29], "uv_size": [6, 3]}, + "west": {"uv": [44, 41], "uv_size": [1, 3]}, + "up": {"uv": [38, 37], "uv_size": [6, 1]}, + "down": {"uv": [44, 41], "uv_size": [6, -1]} + } + }, + { + "origin": [-3, 11, -4], + "size": [6, 3, 1], + "pivot": [0, 12.5, 0], + "rotation": [0, -90, 0], + "uv": { + "north": {"uv": [38, 41], "uv_size": [6, 3]}, + "east": {"uv": [37, 41], "uv_size": [1, 3]}, + "south": {"uv": [64, 23], "uv_size": [6, 3]}, + "west": {"uv": [44, 41], "uv_size": [1, 3]}, + "up": {"uv": [52, 37], "uv_size": [6, 1]}, + "down": {"uv": [44, 41], "uv_size": [6, -1]} + } + }, + { + "origin": [-6, 13, -6], + "size": [2, 1, 12], + "uv": { + "north": {"uv": [12, 33], "uv_size": [2, 1]}, + "east": {"uv": [0, 33], "uv_size": [12, 1]}, + "south": {"uv": [26, 33], "uv_size": [2, 1]}, + "west": {"uv": [14, 33], "uv_size": [12, 1]}, + "up": {"uv": [62, 24], "uv_size": [2, 12]}, + "down": {"uv": [14, 33], "uv_size": [2, -12]} + } + }, + { + "origin": [4, 13, -6], + "size": [2, 1, 12], + "pivot": [5, 13.5, 0], + "rotation": [0, 180, 0], + "uv": { + "north": {"uv": [12, 33], "uv_size": [2, 1]}, + "east": {"uv": [0, 33], "uv_size": [12, 1]}, + "south": {"uv": [26, 33], "uv_size": [2, 1]}, + "west": {"uv": [14, 33], "uv_size": [12, 1]}, + "up": {"uv": [60, 24], "uv_size": [2, 12]}, + "down": {"uv": [14, 33], "uv_size": [2, -12]} + } + }, + { + "origin": [-6, 13, -4], + "size": [2, 1, 8], + "pivot": [0, 13.5, 0], + "rotation": [0, 90, 0], + "uv": { + "north": {"uv": [74, 14], "uv_size": [2, 1]}, + "east": {"uv": [66, 14], "uv_size": [8, 1]}, + "south": {"uv": [84, 14], "uv_size": [2, 1]}, + "west": {"uv": [76, 14], "uv_size": [8, 1]}, + "up": {"uv": [74, 6], "uv_size": [2, 8]}, + "down": {"uv": [76, 14], "uv_size": [2, -8]} + } + }, + { + "origin": [-6, 13, -4], + "size": [2, 1, 8], + "pivot": [0, 13.5, 0], + "rotation": [0, -90, 0], + "uv": { + "north": {"uv": [74, 14], "uv_size": [2, 1]}, + "east": {"uv": [66, 14], "uv_size": [8, 1]}, + "south": {"uv": [84, 14], "uv_size": [2, 1]}, + "west": {"uv": [76, 14], "uv_size": [8, 1]}, + "up": {"uv": [71, 6], "uv_size": [2, 8]}, + "down": {"uv": [76, 14], "uv_size": [2, -8]} + } + }, + {"origin": [5, 14, -6], "size": [1, 1, 12], "uv": [28, 44]}, + {"origin": [-6, 14, -6], "size": [1, 1, 12], "uv": [36, 9]}, + {"origin": [-6, 14, -5], "size": [1, 1, 10], "pivot": [0, 14.5, 0], "rotation": [0, 90, 0], "uv": [36, 22]}, + {"origin": [5, 14, -5], "size": [1, 1, 10], "pivot": [0, 14.5, 0], "rotation": [0, 90, 0], "uv": [42, 44]}, + {"origin": [6, 0, -8], "size": [2, 15, 2], "uv": [0, 49]}, + {"origin": [-8, 0, 6], "size": [2, 15, 2], "uv": [16, 49]}, + {"origin": [-6.575, 11.925, 4], "size": [2, 3, 2], "pivot": [-7, 13.5, 5], "rotation": [0, -45, 0], "uv": [0, 34]}, + {"origin": [4.575, 11.925, 4], "size": [2, 3, 2], "pivot": [7, 13.5, 5], "rotation": [0, 45, 0], "uv": [0, 21]}, + {"origin": [4.575, 11.925, -6], "size": [2, 3, 2], "pivot": [7, 13.5, -5], "rotation": [0, -45, 0], "uv": [0, 5]}, + {"origin": [-6.575, 11.925, -6], "size": [2, 3, 2], "pivot": [-7, 13.5, -5], "rotation": [0, 45, 0], "uv": [0, 0]}, + {"origin": [4.56027, 12.89987, -5.55052], "size": [1.95, 1.75, 2], "pivot": [5.53527, 14.39987, -5.55052], "rotation": [-45, -45, 0], "uv": [6, 29]}, + {"origin": [4.56027, 12.89987, 3.55052], "size": [1.95, 1.75, 2], "pivot": [5.53527, 14.39987, 5.55052], "rotation": [45, 45, 0], "uv": [6, 8]}, + {"origin": [-6.51027, 12.89987, -5.55052], "size": [1.95, 1.75, 2], "pivot": [-5.53527, 14.39987, -5.55052], "rotation": [-45, 45, 0], "uv": [6, 24]}, + {"origin": [-6.51027, 12.89987, 3.55052], "size": [1.95, 1.75, 2], "pivot": [-5.53527, 14.39987, 5.55052], "rotation": [45, -45, 0], "uv": [6, 3]}, + {"origin": [6, 0, 6], "size": [2, 15, 2], "uv": [8, 49]}, + {"origin": [4, 0, 6], "size": [2, 2, 2], "uv": [48, 22]}, + {"origin": [-6, 0, 6], "size": [2, 2, 2], "uv": [26, 46]}, + {"origin": [-8, 0, 4], "size": [2, 2, 2], "uv": [42, 44]}, + {"origin": [-8, 0, -6], "size": [2, 2, 2], "uv": [0, 39]}, + {"origin": [-6, 0, -8], "size": [2, 2, 2], "uv": [30, 38]}, + {"origin": [4, 0, -8], "size": [2, 2, 2], "uv": [36, 26]}, + {"origin": [6, 0, 4], "size": [2, 2, 2], "uv": [36, 22]}, + {"origin": [6, 0, -6], "size": [2, 2, 2], "uv": [30, 34]}, + {"origin": [2, 5, 6], "size": [1, 6, 1], "uv": [91, 6]}, + {"origin": [-3, 5, 6], "size": [1, 6, 1], "uv": [91, 6]}, + {"origin": [-2, 10, 6], "size": [4, 1, 1], "uv": [84, 3]}, + {"origin": [-3, 5, 19], "size": [1, 6, 1], "pivot": [0, 9.25, 6.5], "rotation": [0, 180, 0], "uv": [91, 6]}, + {"origin": [-2, 10, 19], "size": [4, 1, 1], "pivot": [0, 9.25, 6.5], "rotation": [0, 180, 0], "uv": [84, 3]}, + {"origin": [2, 5, 19], "size": [1, 6, 1], "pivot": [0, 9.25, 6.5], "rotation": [0, 180, 0], "uv": [91, 6]} + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/theurgy/lang/zh_cn.json b/src/main/resources/assets/theurgy/lang/zh_cn.json deleted file mode 100644 index 6e49c61db..000000000 --- a/src/main/resources/assets/theurgy/lang/zh_cn.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "book.theurgy.the_hermetica.getting_started.about_mod.about.text": "亲爱的读者,欢迎来到神术,一个探索古老而崇高的经典炼金术的模组。于你踏上这高雅的变换术的修行之时,你会需要装备探测杖来助你更轻松地获取世界上的资源。\n", - "book.theurgy.the_hermetica.getting_started.about_mod.about.title": "炼金术的艺术", - "book.theurgy.the_hermetica.getting_started.about_mod.about2.text": "长年累月的刻苦学习和练习之后,你便能学习使用炼金术设备去提炼,复制和变换资源的能力。在此过程中,你将有机会制作炼金术设备来帮助你的工作。\n", - "book.theurgy.the_hermetica.getting_started.about_mod.description": "关于此模组", - "book.theurgy.the_hermetica.getting_started.about_mod.features.text": "- 可以寻找矿物的探测杖\n- 未来计划:矿物提炼(= 每个矿物产更多锭)\n- 未来计划:物品复制(复制已有物品)\n- 未来计划:物品变换(从一个物品产生另一个物品)\n", - "book.theurgy.the_hermetica.getting_started.about_mod.features.title": "功能", - "book.theurgy.the_hermetica.getting_started.about_mod.features2.text": "- 未来计划:武器和装备\n- 未来计划:辅助日常工作的设备\n", - "book.theurgy.the_hermetica.getting_started.about_mod.features2.title": "更多功能", - "book.theurgy.the_hermetica.getting_started.about_mod.name": "炼金术的艺术", - "book.theurgy.the_hermetica.getting_started.divination_rod.description": "如何找到矿物", - "book.theurgy.the_hermetica.getting_started.divination_rod.intro.text": "作为初出茅庐的炼金术士,熟悉你可以掌握的各种工具和技术至关重要。其中一种工具便是探测杖,一个用于定位世界中隐藏的矿物的仪器。\n", - "book.theurgy.the_hermetica.getting_started.divination_rod.intro2.text": " 将探测杖和你的意识同调到地球上的元素能量,你便可检测到矿簇的存在,并引导自己前往矿物的位置。经过练习,使用探测杖可以极大地帮助你为你的炼金术追求收集必要的资源。\n", - "book.theurgy.the_hermetica.getting_started.divination_rod.name": "探测杖", - "book.theurgy.the_hermetica.getting_started.divination_rod.recipe.text": "最基础等级的探测杖,易碎而且应用范围有限,但依然很强大。\n", - "book.theurgy.the_hermetica.getting_started.divination_rod.supported_blocks.text": "探测杖可以同调到各种有用的方块,包括各种类型的矿物和木头。基础探测杖用于定位[铁](item://minecraft:iron_ore)或[煤炭](item://minecraft:coal_ore)这种常见矿石已经足够。但诸如[钻石](item://minecraft:diamond_ore)的更稀有的材料需要高阶的探测杖探测。\n", - "book.theurgy.the_hermetica.getting_started.divination_rod.supported_blocks.title": "可同调的材料", - "book.theurgy.the_hermetica.getting_started.divination_rod.usage.text": "- **Shift点击** 一个方块将探测杖同调到此方块。\n- **长按右键** 使用探测杖搜索方块。\n- **右键单击** 可以在不消耗耐久的情况下显示探测杖最后成功找到的方块。\n", - "book.theurgy.the_hermetica.getting_started.divination_rod.usage.title": "用途", - "book.theurgy.the_hermetica.getting_started.intro.description": "关于使用神言秘术", - "book.theurgy.the_hermetica.getting_started.intro.help.text": "如果读者遇到了任何问题,炼金术士理事会(又名Kli Kli的Discord服务器)会及时提供帮助。\n\\\n\\\n[点击https://invite.gg/klikli加入服务器获取帮助](https://invite.gg/klikli)\n", - "book.theurgy.the_hermetica.getting_started.intro.help.title": "寻求咨询", - "book.theurgy.the_hermetica.getting_started.intro.intro.text": "接下来的几页将会带领新手炼金术士踏上物质和意识的变换的高雅艺术之路。在下会分享自己的经验,见解和研究笔记,在主题允许的范围内,安全地引导有价值的读者。\n", - "book.theurgy.the_hermetica.getting_started.intro.intro.title": "关于此模组", - "book.theurgy.the_hermetica.getting_started.intro.name": "关于此模组", - "book.theurgy.the_hermetica.getting_started.name": "新手入门", - "book.theurgy.the_hermetica.name": "神言秘术", - "book.theurgy.the_hermetica.tooltip": "古代炼金术艺术的专著。\n§o(神术模组指南)§r", - "item.theurgy.alchemical_sulfur": "炼金磺%s", - "item.theurgy.alchemical_sulfur.tooltip": "用%s制成的炼金磺", - "item.theurgy.alchemical_sulfur.tooltip.extended": "磺是一个物体的“思想”或“精神”,是复制和转化的关键。", - "item.theurgy.divination_rod_t1": "玻璃探测杖", - "item.theurgy.divination_rod_t1.linked": "玻璃探测杖%s", - "item.theurgy.divination_rod_t1.tooltip.extended": "探测杖可以同调到方块,然后被用于寻找同类型方块。", - "item.theurgy.divination_rod_t1.tooltip.usage": "§aShift点击§7 一个方块将探测杖同调到此方块。\n§a长按右键§7 使用探测杖搜索方块。\n§a右键单击§7 可以在不消耗耐久的情况下显示探测杖最后成功找到的方块。", - "item.theurgy.divination_rod_t2": "铁探测杖", - "item.theurgy.divination_rod_t2.linked": "铁探测杖%s", - "item.theurgy.divination_rod_t2.tooltip.extended": "探测杖可以同调到方块,然后被用于寻找同类型方块。", - "item.theurgy.divination_rod_t2.tooltip.usage": "§aShift点击§7 一个方块将探测杖同调到此方块。\n§a长按右键§7 使用探测杖搜索方块。\n§a右键单击§7 可以在不消耗耐久的情况下显示探测杖最后成功找到的方块。", - "item.theurgy.divination_rod_t3": "钻石探测杖", - "item.theurgy.divination_rod_t3.linked": "钻石探测杖%s", - "item.theurgy.divination_rod_t3.tooltip.extended": "探测杖可以同调到方块,然后被用于寻找同类型方块。", - "item.theurgy.divination_rod_t3.tooltip.usage": "§aShift点击§7 一个方块将探测杖同调到此方块。\n§a长按右键§7 使用探测杖搜索方块。\n§a右键单击§7 可以在不消耗耐久的情况下显示探测杖最后成功找到的方块。", - "item.theurgy.divination_rod_t4": "下界合金探测杖", - "item.theurgy.divination_rod_t4.linked": "下界合金探测杖%s", - "item.theurgy.divination_rod_t4.tooltip.extended": "探测杖可以同调到方块,然后被用于寻找同类型方块。", - "item.theurgy.divination_rod_t4.tooltip.usage": "§aShift点击§7 一个方块将探测杖同调到此方块。\n§a长按右键§7 使用探测杖搜索方块。\n§a右键单击§7 可以在不消耗耐久的情况下显示探测杖最后成功找到的方块。", - "item.theurgy.empty_jar": "空罐子", - "item.theurgy.empty_jar_labeled": "带标签的空罐子", - "item.theurgy.empty_jar_labeled.tooltip": "如果炼金磺的来源物品没有展示时用于渲染的虚拟物品。", - "item.theurgy.jar_label": "罐子标签", - "item.theurgy.jar_label.tooltip": "如果炼金磺的来源物品被展示时用于渲染的虚拟物品。", - "itemGroup.theurgy": "神术", - "message.theurgy.divination_rod.attuning_not_allowed": "§4警告§r:无法手动同调这种探测杖。", - "message.theurgy.divination_rod.block_disallowed": "§4警告§r:探测杖不能同调到该类型的方块:%s。", - "message.theurgy.divination_rod.block_not_allowed": "§4警告§r:探测杖不能同调到该类型的方块:%s。", - "message.theurgy.divination_rod.linked": "§a成功§r:探测杖现同调到%s。", - "message.theurgy.divination_rod.no_link": "探测杖未与任何材料同调。", - "message.theurgy.divination_rod.tier_too_low": "§4警告§r:需要更高级别的探测杖来同调 %s。", - "theurgy.subtitle.tuning_fork": "使用探测杖", - "tooltip.theurgy..divination_rod.last_result": "已找到 %s 位于 %s", - "tooltip.theurgy..divination_rod.linked_to": "探测杖被同调到%s。", - "tooltip.theurgy..divination_rod.no_link": "探测杖§c没有§r与任何材料同调。", - "tooltip.theurgy.show_extended": "§6[§dshift §7显示更多§6]", - "tooltip.theurgy.show_usage": "§6[§dctrl §7显示用途§6]" -} \ No newline at end of file diff --git a/src/main/resources/assets/theurgy/models/block/incubator_pipe_template.json b/src/main/resources/assets/theurgy/models/block/incubator_pipe_template.json new file mode 100644 index 000000000..243767ee9 --- /dev/null +++ b/src/main/resources/assets/theurgy/models/block/incubator_pipe_template.json @@ -0,0 +1,22 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "texture": "incubator_pipe" + }, + "elements": [ + { + "from": [7, 8, -1.5], + "to": [9, 10, 2.5], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 9, -0.5]}, + "faces": { + "north": {"uv": [4, 4, 6, 6], "texture": "#texture"}, + "east": {"uv": [0, 4, 4, 6], "texture": "#texture"}, + "south": {"uv": [10, 4, 12, 6], "texture": "#texture"}, + "west": {"uv": [6, 4, 10, 6], "texture": "#texture"}, + "up": {"uv": [6, 4, 4, 0], "texture": "#texture"}, + "down": {"uv": [8, 0, 6, 4], "texture": "#texture"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/theurgy/models/block/incubator_template.json b/src/main/resources/assets/theurgy/models/block/incubator_template.json new file mode 100644 index 000000000..17a92fca8 --- /dev/null +++ b/src/main/resources/assets/theurgy/models/block/incubator_template.json @@ -0,0 +1,101 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [128, 128], + "textures": { + "texture": "incubator_gold" + }, + "elements": [ + { + "from": [0, 0, 0], + "to": [16, 4, 16], + "faces": { + "north": {"uv": [2, 6, 4, 6.5], "texture": "#texture"}, + "east": {"uv": [0, 6, 2, 6.5], "texture": "#texture"}, + "south": {"uv": [6, 6, 8, 6.5], "texture": "#texture"}, + "west": {"uv": [4, 6, 6, 6.5], "texture": "#texture"}, + "up": {"uv": [4, 6, 2, 4], "texture": "#texture"}, + "down": {"uv": [6, 4, 4, 6], "texture": "#texture"} + } + }, + { + "from": [2, 4, 2], + "to": [14, 10, 14], + "faces": { + "north": {"uv": [7.5, 4, 9, 4.75], "texture": "#texture"}, + "east": {"uv": [6, 4, 7.5, 4.75], "texture": "#texture"}, + "south": {"uv": [10.5, 4, 12, 4.75], "texture": "#texture"}, + "west": {"uv": [9, 4, 10.5, 4.75], "texture": "#texture"}, + "up": {"uv": [9, 4, 7.5, 2.5], "texture": "#texture"}, + "down": {"uv": [10.5, 2.5, 9, 4], "texture": "#texture"} + } + }, + { + "from": [1, 10, 1], + "to": [15, 28, 15], + "faces": { + "north": {"uv": [1.75, 1.75, 3.5, 4], "texture": "#texture"}, + "east": {"uv": [0, 1.75, 1.75, 4], "texture": "#texture"}, + "south": {"uv": [5.25, 1.75, 7, 4], "texture": "#texture"}, + "west": {"uv": [3.5, 1.75, 5.25, 4], "texture": "#texture"}, + "up": {"uv": [3.5, 1.75, 1.75, 0], "texture": "#texture"}, + "down": {"uv": [5.25, 0, 3.5, 1.75], "texture": "#texture"} + } + }, + { + "from": [13, 28, 3], + "to": [16, 30, 13], + "faces": { + "north": {"uv": [4.5, 7.75, 4.875, 8], "texture": "#texture"}, + "east": {"uv": [3.25, 7.75, 4.5, 8], "texture": "#texture"}, + "south": {"uv": [6.125, 7.75, 6.5, 8], "texture": "#texture"}, + "west": {"uv": [4.875, 7.75, 6.125, 8], "texture": "#texture"}, + "up": {"uv": [4.875, 7.75, 4.5, 6.5], "texture": "#texture"}, + "down": {"uv": [5.25, 6.5, 4.875, 7.75], "texture": "#texture"} + } + }, + { + "from": [0, 28, 13], + "to": [16, 30, 16], + "faces": { + "north": {"uv": [5.625, 1, 7.625, 1.25], "texture": "#texture"}, + "east": {"uv": [5.25, 1, 5.625, 1.25], "texture": "#texture"}, + "south": {"uv": [8, 1, 10, 1.25], "texture": "#texture"}, + "west": {"uv": [7.625, 1, 8, 1.25], "texture": "#texture"}, + "up": {"uv": [7.625, 1, 5.625, 0.625], "texture": "#texture"}, + "down": {"uv": [9.625, 0.625, 7.625, 1], "texture": "#texture"} + } + }, + { + "from": [0, 28, 0], + "to": [16, 30, 3], + "faces": { + "north": {"uv": [5.625, 0.375, 7.625, 0.625], "texture": "#texture"}, + "east": {"uv": [5.25, 0.375, 5.625, 0.625], "texture": "#texture"}, + "south": {"uv": [8, 0.375, 10, 0.625], "texture": "#texture"}, + "west": {"uv": [7.625, 0.375, 8, 0.625], "texture": "#texture"}, + "up": {"uv": [7.625, 0.375, 5.625, 0], "texture": "#texture"}, + "down": {"uv": [9.625, 0, 7.625, 0.375], "texture": "#texture"} + } + }, + { + "from": [0, 28, 3], + "to": [3, 30, 13], + "faces": { + "north": {"uv": [1.25, 7.75, 1.625, 8], "texture": "#texture"}, + "east": {"uv": [0, 7.75, 1.25, 8], "texture": "#texture"}, + "south": {"uv": [2.875, 7.75, 3.25, 8], "texture": "#texture"}, + "west": {"uv": [1.625, 7.75, 2.875, 8], "texture": "#texture"}, + "up": {"uv": [1.625, 7.75, 1.25, 6.5], "texture": "#texture"}, + "down": {"uv": [2, 6.5, 1.625, 7.75], "texture": "#texture"} + } + } + ], + "groups": [ + { + "name": "Incubator", + "origin": [0, 0, 0], + "color": 0, + "children": [0, 1, 2, 3, 4, 5, 6] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/theurgy/models/block/liquefaction_cauldron_template.json b/src/main/resources/assets/theurgy/models/block/liquefaction_cauldron_template.json new file mode 100644 index 000000000..1d77ab24a --- /dev/null +++ b/src/main/resources/assets/theurgy/models/block/liquefaction_cauldron_template.json @@ -0,0 +1,391 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "texture_size": [128, 128], + "textures": { + "particle": "liquefaction_cauldron", + "texture": "liquefaction_cauldron" + }, + "elements": [ + { + "from": [3, 3.4, 3], + "to": [12.999, 18.4, 4], + "faces": { + "north": {"uv": [0, 0, 1.25, 1.875], "texture": "#texture"}, + "east": {"uv": [1.125, 7.75, 1.25, 9.625], "texture": "#texture"}, + "south": {"uv": [1.25, 0, 2.5, 1.875], "texture": "#texture"}, + "west": {"uv": [7.125, 8.375, 7.25, 10.25], "texture": "#texture"}, + "up": {"uv": [10, 7.5, 8.75, 7.375], "texture": "#texture"}, + "down": {"uv": [10.125, 4.25, 8.875, 4.375], "texture": "#texture"} + } + }, + { + "from": [3, 3.4, 12], + "to": [13.001, 18.4, 13], + "faces": { + "north": {"uv": [0, 1.875, 1.25, 3.75], "texture": "#texture"}, + "east": {"uv": [1, 8.5, 1.125, 10.375], "texture": "#texture"}, + "south": {"uv": [1.25, 1.875, 2.5, 3.75], "texture": "#texture"}, + "west": {"uv": [7.25, 8.5, 7.375, 10.375], "texture": "#texture"}, + "up": {"uv": [10.125, 4.5, 8.875, 4.375], "texture": "#texture"}, + "down": {"uv": [10.125, 4.5, 8.875, 4.625], "texture": "#texture"} + } + }, + { + "from": [12, 3.4, 3], + "to": [13, 18.4, 13.001], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 20.5, 11.5]}, + "faces": { + "north": {"uv": [7.375, 8.5, 7.5, 10.375], "texture": "#texture"}, + "east": {"uv": [2.5, 0, 3.75, 1.875], "texture": "#texture"}, + "south": {"uv": [7.5, 8.5, 7.625, 10.375], "texture": "#texture"}, + "west": {"uv": [2.5, 1.875, 3.75, 3.75], "texture": "#texture"}, + "up": {"uv": [4.875, 10.125, 4.75, 8.875], "texture": "#texture"}, + "down": {"uv": [5, 8.875, 4.875, 10.125], "texture": "#texture"} + } + }, + { + "from": [3, 3.4, 3], + "to": [4, 18.4, 13.001], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 20.5, 11.5]}, + "faces": { + "north": {"uv": [8.5, 7.5, 8.625, 9.375], "texture": "#texture"}, + "east": {"uv": [0, 3.75, 1.25, 5.625], "texture": "#texture"}, + "south": {"uv": [7.625, 8.5, 7.75, 10.375], "texture": "#texture"}, + "west": {"uv": [3.75, 0, 5, 1.875], "texture": "#texture"}, + "up": {"uv": [5.125, 10.125, 5, 8.875], "texture": "#texture"}, + "down": {"uv": [5.25, 8.875, 5.125, 10.125], "texture": "#texture"} + } + }, + { + "from": [3, 1.9, 3], + "to": [13, 3.4, 13], + "faces": { + "north": {"uv": [7.5, 7.25, 8.75, 7.5], "texture": "#texture"}, + "east": {"uv": [2.75, 7.625, 4, 7.875], "texture": "#texture"}, + "south": {"uv": [4, 7.625, 5.25, 7.875], "texture": "#texture"}, + "west": {"uv": [5.25, 7.625, 6.5, 7.875], "texture": "#texture"}, + "up": {"uv": [3.75, 5, 2.5, 3.75], "texture": "#texture"}, + "down": {"uv": [5, 3.125, 3.75, 4.375], "texture": "#texture"} + } + }, + { + "from": [13, 14.9, 13], + "to": [17, 21.9, 17], + "faces": { + "north": {"uv": [5.75, 3.875, 6.25, 4.75], "texture": "#texture"}, + "east": {"uv": [5.75, 4.75, 6.25, 5.625], "texture": "#texture"}, + "south": {"uv": [5.75, 5.625, 6.25, 6.5], "texture": "#texture"}, + "west": {"uv": [1.25, 6, 1.75, 6.875], "texture": "#texture"}, + "up": {"uv": [3.625, 8.375, 3.125, 7.875], "texture": "#texture"}, + "down": {"uv": [4.125, 7.875, 3.625, 8.375], "texture": "#texture"} + } + }, + { + "from": [-1, 14.9, 13], + "to": [3, 21.9, 17], + "faces": { + "north": {"uv": [1.75, 6, 2.25, 6.875], "texture": "#texture"}, + "east": {"uv": [2.25, 6, 2.75, 6.875], "texture": "#texture"}, + "south": {"uv": [2.75, 6, 3.25, 6.875], "texture": "#texture"}, + "west": {"uv": [3.25, 6, 3.75, 6.875], "texture": "#texture"}, + "up": {"uv": [4.625, 8.375, 4.125, 7.875], "texture": "#texture"}, + "down": {"uv": [5.125, 7.875, 4.625, 8.375], "texture": "#texture"} + } + }, + { + "from": [3, 15.55, 14], + "to": [13, 20.4, 16], + "faces": { + "north": {"uv": [3.75, 4.375, 5, 5], "texture": "#texture"}, + "east": {"uv": [8.25, 8.75, 8.5, 9.375], "texture": "#texture"}, + "south": {"uv": [5, 0, 6.25, 0.625], "texture": "#texture"}, + "west": {"uv": [3, 8.875, 3.25, 9.5], "texture": "#texture"}, + "up": {"uv": [8.5, 4.25, 7.25, 4], "texture": "#texture"}, + "down": {"uv": [8.5, 4.25, 7.25, 4.5], "texture": "#texture"} + } + }, + { + "from": [3, 15.55, 0], + "to": [13, 20.4, 2], + "faces": { + "north": {"uv": [5, 0.625, 6.25, 1.25], "texture": "#texture"}, + "east": {"uv": [3.25, 8.875, 3.5, 9.5], "texture": "#texture"}, + "south": {"uv": [1.25, 5, 2.5, 5.625], "texture": "#texture"}, + "west": {"uv": [3.5, 8.875, 3.75, 9.5], "texture": "#texture"}, + "up": {"uv": [8.5, 4.75, 7.25, 4.5], "texture": "#texture"}, + "down": {"uv": [8.5, 4.75, 7.25, 5], "texture": "#texture"} + } + }, + { + "from": [14, 15.55, 3], + "to": [16, 20.4, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 27.575, 15.5]}, + "faces": { + "north": {"uv": [3.75, 8.875, 4, 9.5], "texture": "#texture"}, + "east": {"uv": [5, 1.25, 6.25, 1.875], "texture": "#texture"}, + "south": {"uv": [4, 8.875, 4.25, 9.5], "texture": "#texture"}, + "west": {"uv": [5, 1.875, 6.25, 2.5], "texture": "#texture"}, + "up": {"uv": [7.5, 6.25, 7.25, 5], "texture": "#texture"}, + "down": {"uv": [7.5, 6.25, 7.25, 7.5], "texture": "#texture"} + } + }, + { + "from": [0, 15.55, 3], + "to": [2, 20.4, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 27.575, 15.5]}, + "faces": { + "north": {"uv": [4.25, 8.875, 4.5, 9.5], "texture": "#texture"}, + "east": {"uv": [2.5, 5, 3.75, 5.625], "texture": "#texture"}, + "south": {"uv": [4.5, 8.875, 4.75, 9.5], "texture": "#texture"}, + "west": {"uv": [5, 2.5, 6.25, 3.125], "texture": "#texture"}, + "up": {"uv": [1.5, 8.625, 1.25, 7.375], "texture": "#texture"}, + "down": {"uv": [1.75, 7.375, 1.5, 8.625], "texture": "#texture"} + } + }, + { + "from": [2, 13.55, 6], + "to": [5, 19.4, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 27.575, 15.5]}, + "faces": { + "north": {"uv": [6.5, 7.625, 6.875, 8.375], "texture": "#texture"}, + "east": {"uv": [6.75, 0, 7.25, 0.75], "texture": "#texture"}, + "south": {"uv": [6.875, 7.625, 7.25, 8.375], "texture": "#texture"}, + "west": {"uv": [6.75, 0.75, 7.25, 1.5], "texture": "#texture"}, + "up": {"uv": [6.5, 8.375, 6.125, 7.875], "texture": "#texture"}, + "down": {"uv": [8.875, 4.25, 8.5, 4.75], "texture": "#texture"} + } + }, + { + "from": [11, 13.55, 6], + "to": [14, 19.4, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 27.575, 15.5]}, + "faces": { + "north": {"uv": [0, 7.75, 0.375, 8.5], "texture": "#texture"}, + "east": {"uv": [6.75, 1.5, 7.25, 2.25], "texture": "#texture"}, + "south": {"uv": [0.375, 7.75, 0.75, 8.5], "texture": "#texture"}, + "west": {"uv": [6.75, 2.25, 7.25, 3], "texture": "#texture"}, + "up": {"uv": [1.625, 9.125, 1.25, 8.625], "texture": "#texture"}, + "down": {"uv": [2, 8.625, 1.625, 9.125], "texture": "#texture"} + } + }, + { + "from": [6, 13.55, 2], + "to": [10, 19.4, 5], + "rotation": {"angle": 0, "axis": "y", "origin": [12.5, 27.075, 8]}, + "faces": { + "north": {"uv": [6.75, 3.875, 7.25, 4.625], "texture": "#texture"}, + "east": {"uv": [0.75, 7.75, 1.125, 8.5], "texture": "#texture"}, + "south": {"uv": [6.75, 4.625, 7.25, 5.375], "texture": "#texture"}, + "west": {"uv": [7.25, 7.75, 7.625, 8.5], "texture": "#texture"}, + "up": {"uv": [2.5, 9, 2, 8.625], "texture": "#texture"}, + "down": {"uv": [3, 8.625, 2.5, 9], "texture": "#texture"} + } + }, + { + "from": [6, 13.55, 11], + "to": [10, 19.4, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [12.5, 27.075, 8]}, + "faces": { + "north": {"uv": [6.75, 5.375, 7.25, 6.125], "texture": "#texture"}, + "east": {"uv": [7.625, 7.75, 8, 8.5], "texture": "#texture"}, + "south": {"uv": [6.75, 6.125, 7.25, 6.875], "texture": "#texture"}, + "west": {"uv": [2.75, 7.875, 3.125, 8.625], "texture": "#texture"}, + "up": {"uv": [9.125, 7.875, 8.625, 7.5], "texture": "#texture"}, + "down": {"uv": [9.125, 7.875, 8.625, 8.25], "texture": "#texture"} + } + }, + { + "from": [-1, 14.9, -1], + "to": [3, 21.9, 3], + "faces": { + "north": {"uv": [6.25, 0, 6.75, 0.875], "texture": "#texture"}, + "east": {"uv": [6.25, 0.875, 6.75, 1.75], "texture": "#texture"}, + "south": {"uv": [6.25, 1.75, 6.75, 2.625], "texture": "#texture"}, + "west": {"uv": [6.25, 3.875, 6.75, 4.75], "texture": "#texture"}, + "up": {"uv": [5.625, 8.375, 5.125, 7.875], "texture": "#texture"}, + "down": {"uv": [6.125, 7.875, 5.625, 8.375], "texture": "#texture"} + } + }, + { + "from": [13, -0.1, 13], + "to": [17, 6.9, 17], + "faces": { + "north": {"uv": [5.75, 3.875, 6.25, 4.75], "texture": "#texture"}, + "east": {"uv": [5.75, 4.75, 6.25, 5.625], "texture": "#texture"}, + "south": {"uv": [5.75, 5.625, 6.25, 6.5], "texture": "#texture"}, + "west": {"uv": [1.25, 6, 1.75, 6.875], "texture": "#texture"}, + "up": {"uv": [3.625, 8.375, 3.125, 7.875], "texture": "#texture"}, + "down": {"uv": [4.125, 7.875, 3.625, 8.375], "texture": "#texture"} + } + }, + { + "from": [-1, -0.1, 13], + "to": [3, 6.9, 17], + "faces": { + "north": {"uv": [1.75, 6, 2.25, 6.875], "texture": "#texture"}, + "east": {"uv": [2.25, 6, 2.75, 6.875], "texture": "#texture"}, + "south": {"uv": [2.75, 6, 3.25, 6.875], "texture": "#texture"}, + "west": {"uv": [3.25, 6, 3.75, 6.875], "texture": "#texture"}, + "up": {"uv": [4.625, 8.375, 4.125, 7.875], "texture": "#texture"}, + "down": {"uv": [5.125, 7.875, 4.625, 8.375], "texture": "#texture"} + } + }, + { + "from": [13, -0.1, -1], + "to": [17, 6.9, 3], + "faces": { + "north": {"uv": [6.25, 4.75, 6.75, 5.625], "texture": "#texture"}, + "east": {"uv": [6.25, 5.625, 6.75, 6.5], "texture": "#texture"}, + "south": {"uv": [5.75, 6.5, 6.25, 7.375], "texture": "#texture"}, + "west": {"uv": [6.25, 6.5, 6.75, 7.375], "texture": "#texture"}, + "up": {"uv": [8.5, 0.5, 8, 0], "texture": "#texture"}, + "down": {"uv": [8.5, 0.5, 8, 1], "texture": "#texture"} + } + }, + { + "from": [-1, -0.1, -1], + "to": [3, 6.9, 3], + "faces": { + "north": {"uv": [6.25, 0, 6.75, 0.875], "texture": "#texture"}, + "east": {"uv": [6.25, 0.875, 6.75, 1.75], "texture": "#texture"}, + "south": {"uv": [6.25, 1.75, 6.75, 2.625], "texture": "#texture"}, + "west": {"uv": [6.25, 3.875, 6.75, 4.75], "texture": "#texture"}, + "up": {"uv": [5.625, 8.375, 5.125, 7.875], "texture": "#texture"}, + "down": {"uv": [6.125, 7.875, 5.625, 8.375], "texture": "#texture"} + } + }, + { + "from": [13, 14.9, -1], + "to": [17, 21.9, 3], + "faces": { + "north": {"uv": [6.25, 4.75, 6.75, 5.625], "texture": "#texture"}, + "east": {"uv": [6.25, 5.625, 6.75, 6.5], "texture": "#texture"}, + "south": {"uv": [5.75, 6.5, 6.25, 7.375], "texture": "#texture"}, + "west": {"uv": [6.25, 6.5, 6.75, 7.375], "texture": "#texture"}, + "up": {"uv": [8.5, 0.5, 8, 0], "texture": "#texture"}, + "down": {"uv": [8.5, 0.5, 8, 1], "texture": "#texture"} + } + }, + { + "from": [13, 6.9, -1], + "to": [17, 8.9, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [15, 4, 8]}, + "faces": { + "north": {"uv": [5.75, 7.375, 6.25, 7.625], "texture": "#texture"}, + "east": {"uv": [6.25, 7.375, 6.75, 7.625], "texture": "#texture"}, + "south": {"uv": [9.125, 7.875, 9.625, 8.125], "texture": "#texture"}, + "west": {"uv": [9.125, 8.125, 9.625, 8.375], "texture": "#texture"}, + "up": {"uv": [4.625, 8.875, 4.125, 8.375], "texture": "#texture"}, + "down": {"uv": [5.125, 8.375, 4.625, 8.875], "texture": "#texture"} + } + }, + { + "from": [13, 6.9, 13], + "to": [17, 8.9, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [15, 4, 8]}, + "faces": { + "north": {"uv": [9.125, 8.375, 9.625, 8.625], "texture": "#texture"}, + "east": {"uv": [9.125, 8.625, 9.625, 8.875], "texture": "#texture"}, + "south": {"uv": [9.25, 2.625, 9.75, 2.875], "texture": "#texture"}, + "west": {"uv": [9.25, 2.875, 9.75, 3.125], "texture": "#texture"}, + "up": {"uv": [5.625, 8.875, 5.125, 8.375], "texture": "#texture"}, + "down": {"uv": [6.125, 8.375, 5.625, 8.875], "texture": "#texture"} + } + }, + { + "from": [-1, 6.9, 13], + "to": [3, 8.9, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [15, 4, 8]}, + "faces": { + "north": {"uv": [9.25, 3.125, 9.75, 3.375], "texture": "#texture"}, + "east": {"uv": [9.25, 4.625, 9.75, 4.875], "texture": "#texture"}, + "south": {"uv": [9.25, 4.875, 9.75, 5.125], "texture": "#texture"}, + "west": {"uv": [9.25, 5.125, 9.75, 5.375], "texture": "#texture"}, + "up": {"uv": [6.625, 8.875, 6.125, 8.375], "texture": "#texture"}, + "down": {"uv": [7.125, 8.375, 6.625, 8.875], "texture": "#texture"} + } + }, + { + "from": [-1, 6.9, -1], + "to": [3, 8.9, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [15, 4, 8]}, + "faces": { + "north": {"uv": [5.25, 9.25, 5.75, 9.5], "texture": "#texture"}, + "east": {"uv": [9.25, 5.375, 9.75, 5.625], "texture": "#texture"}, + "south": {"uv": [9.25, 5.625, 9.75, 5.875], "texture": "#texture"}, + "west": {"uv": [5.75, 9.25, 6.25, 9.5], "texture": "#texture"}, + "up": {"uv": [0.5, 9, 0, 8.5], "texture": "#texture"}, + "down": {"uv": [9, 0, 8.5, 0.5], "texture": "#texture"} + } + }, + { + "from": [0, 0.4, 0], + "to": [2, 15.4, 2], + "faces": { + "north": {"uv": [5, 3.125, 5.25, 5], "texture": "#texture"}, + "east": {"uv": [3.75, 5, 4, 6.875], "texture": "#texture"}, + "south": {"uv": [4, 5, 4.25, 6.875], "texture": "#texture"}, + "west": {"uv": [4.25, 5, 4.5, 6.875], "texture": "#texture"}, + "up": {"uv": [3, 9.5, 2.75, 9.25], "texture": "#texture"}, + "down": {"uv": [9.5, 5.875, 9.25, 6.125], "texture": "#texture"} + } + }, + { + "from": [14, 0.4, 0], + "to": [16, 15.4, 2], + "faces": { + "north": {"uv": [4.5, 5, 4.75, 6.875], "texture": "#texture"}, + "east": {"uv": [4.75, 5, 5, 6.875], "texture": "#texture"}, + "south": {"uv": [5, 5, 5.25, 6.875], "texture": "#texture"}, + "west": {"uv": [5.25, 3.125, 5.5, 5], "texture": "#texture"}, + "up": {"uv": [9.5, 6.375, 9.25, 6.125], "texture": "#texture"}, + "down": {"uv": [6.5, 9.25, 6.25, 9.5], "texture": "#texture"} + } + }, + { + "from": [14, 2.4, 14], + "to": [16, 17.4, 16], + "faces": { + "north": {"uv": [5.25, 5, 5.5, 6.875], "texture": "#texture"}, + "east": {"uv": [5.5, 3.125, 5.75, 5], "texture": "#texture"}, + "south": {"uv": [5.5, 5, 5.75, 6.875], "texture": "#texture"}, + "west": {"uv": [0, 5.625, 0.25, 7.5], "texture": "#texture"}, + "up": {"uv": [9.5, 6.625, 9.25, 6.375], "texture": "#texture"}, + "down": {"uv": [6.75, 9.25, 6.5, 9.5], "texture": "#texture"} + } + }, + { + "from": [0, 0.4, 14], + "to": [2, 15.4, 16], + "faces": { + "north": {"uv": [0.25, 5.625, 0.5, 7.5], "texture": "#texture"}, + "east": {"uv": [0.5, 5.625, 0.75, 7.5], "texture": "#texture"}, + "south": {"uv": [0.75, 5.625, 1, 7.5], "texture": "#texture"}, + "west": {"uv": [1, 5.625, 1.25, 7.5], "texture": "#texture"}, + "up": {"uv": [9.5, 6.875, 9.25, 6.625], "texture": "#texture"}, + "down": {"uv": [7, 9.25, 6.75, 9.5], "texture": "#texture"} + } + } + ], + "groups": [ + { + "name": "culdren", + "origin": [15, 4, 8], + "color": 0, + "children": [0, 1, 2, 3, 4] + }, + { + "name": "coal", + "origin": [15, 4, 8], + "color": 0, + "children": [] + }, + { + "name": "frame", + "origin": [8, 8, 8], + "color": 0, + "children": [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/theurgy/models/block/pyromantic_brazier_lit_template.json b/src/main/resources/assets/theurgy/models/block/pyromantic_brazier_lit_template.json new file mode 100644 index 000000000..7dff37b7b --- /dev/null +++ b/src/main/resources/assets/theurgy/models/block/pyromantic_brazier_lit_template.json @@ -0,0 +1,468 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "texture_size": [128, 128], + "textures": { + "particle": "theurgy:liquefaction_cauldron", + "texture": "theurgy:liquefaction_cauldron", + "fire": "campfire_fire" + }, + "elements": [ + { + "from": [3, 2, 3], + "to": [13, 4.5, 13], + "faces": { + "north": {"uv": [1.25, 5.625, 2.5, 6], "texture": "#texture"}, + "east": {"uv": [2.5, 5.625, 3.75, 6], "texture": "#texture"}, + "south": {"uv": [5.75, 3.125, 7, 3.5], "texture": "#texture"}, + "west": {"uv": [5.75, 3.5, 7, 3.875], "texture": "#texture"}, + "up": {"uv": [2.5, 5, 1.25, 3.75], "texture": "#texture"}, + "down": {"uv": [5, 1.875, 3.75, 3.125], "texture": "#texture"} + } + }, + { + "from": [-1, 3, -1], + "to": [3, 6, 3], + "faces": { + "north": {"uv": [8.75, 6.25, 9.25, 6.625], "texture": "#texture"}, + "east": {"uv": [8.75, 6.625, 9.25, 7], "texture": "#texture"}, + "south": {"uv": [8.75, 7, 9.25, 7.375], "texture": "#texture"}, + "west": {"uv": [7.75, 8.75, 8.25, 9.125], "texture": "#texture"}, + "up": {"uv": [9, 1.5, 8.5, 1], "texture": "#texture"}, + "down": {"uv": [9, 1.5, 8.5, 2], "texture": "#texture"} + } + }, + { + "from": [13, 3, -1], + "to": [17, 6, 3], + "faces": { + "north": {"uv": [8.5, 2, 9, 2.375], "texture": "#texture"}, + "east": {"uv": [8.5, 2.375, 9, 2.75], "texture": "#texture"}, + "south": {"uv": [8.5, 3.5, 9, 3.875], "texture": "#texture"}, + "west": {"uv": [8.5, 3.875, 9, 4.25], "texture": "#texture"}, + "up": {"uv": [6.75, 3.125, 6.25, 2.625], "texture": "#texture"}, + "down": {"uv": [8.25, 3, 7.75, 3.5], "texture": "#texture"} + } + }, + { + "from": [13, 9.5, 13], + "to": [17, 16.5, 17], + "faces": { + "north": {"uv": [5.75, 3.875, 6.25, 4.75], "texture": "#texture"}, + "east": {"uv": [5.75, 4.75, 6.25, 5.625], "texture": "#texture"}, + "south": {"uv": [5.75, 5.625, 6.25, 6.5], "texture": "#texture"}, + "west": {"uv": [1.25, 6, 1.75, 6.875], "texture": "#texture"}, + "up": {"uv": [3.625, 8.375, 3.125, 7.875], "texture": "#texture"}, + "down": {"uv": [4.125, 7.875, 3.625, 8.375], "texture": "#texture"} + } + }, + { + "from": [-1, 9.5, 13], + "to": [3, 16.5, 17], + "faces": { + "north": {"uv": [1.75, 6, 2.25, 6.875], "texture": "#texture"}, + "east": {"uv": [2.25, 6, 2.75, 6.875], "texture": "#texture"}, + "south": {"uv": [2.75, 6, 3.25, 6.875], "texture": "#texture"}, + "west": {"uv": [3.25, 6, 3.75, 6.875], "texture": "#texture"}, + "up": {"uv": [4.625, 8.375, 4.125, 7.875], "texture": "#texture"}, + "down": {"uv": [5.125, 7.875, 4.625, 8.375], "texture": "#texture"} + } + }, + { + "from": [3, 10.15, 14], + "to": [13, 15, 16], + "faces": { + "north": {"uv": [3.75, 4.375, 5, 5], "texture": "#texture"}, + "east": {"uv": [8.25, 8.75, 8.5, 9.375], "texture": "#texture"}, + "south": {"uv": [5, 0, 6.25, 0.625], "texture": "#texture"}, + "west": {"uv": [3, 8.875, 3.25, 9.5], "texture": "#texture"}, + "up": {"uv": [8.5, 4.25, 7.25, 4], "texture": "#texture"}, + "down": {"uv": [8.5, 4.25, 7.25, 4.5], "texture": "#texture"} + } + }, + { + "from": [3, 10.15, 0], + "to": [13, 15, 2], + "faces": { + "north": {"uv": [5, 0.625, 6.25, 1.25], "texture": "#texture"}, + "east": {"uv": [3.25, 8.875, 3.5, 9.5], "texture": "#texture"}, + "south": {"uv": [1.25, 5, 2.5, 5.625], "texture": "#texture"}, + "west": {"uv": [3.5, 8.875, 3.75, 9.5], "texture": "#texture"}, + "up": {"uv": [8.5, 4.75, 7.25, 4.5], "texture": "#texture"}, + "down": {"uv": [8.5, 4.75, 7.25, 5], "texture": "#texture"} + } + }, + { + "from": [14, 10.15, 3], + "to": [16, 15, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 27.575, 15.5]}, + "faces": { + "north": {"uv": [3.75, 8.875, 4, 9.5], "texture": "#texture"}, + "east": {"uv": [5, 1.25, 6.25, 1.875], "texture": "#texture"}, + "south": {"uv": [4, 8.875, 4.25, 9.5], "texture": "#texture"}, + "west": {"uv": [5, 1.875, 6.25, 2.5], "texture": "#texture"}, + "up": {"uv": [7.5, 6.25, 7.25, 5], "texture": "#texture"}, + "down": {"uv": [7.5, 6.25, 7.25, 7.5], "texture": "#texture"} + } + }, + { + "from": [0, 10.15, 3], + "to": [2, 15, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 27.575, 15.5]}, + "faces": { + "north": {"uv": [4.25, 8.875, 4.5, 9.5], "texture": "#texture"}, + "east": {"uv": [2.5, 5, 3.75, 5.625], "texture": "#texture"}, + "south": {"uv": [4.5, 8.875, 4.75, 9.5], "texture": "#texture"}, + "west": {"uv": [5, 2.5, 6.25, 3.125], "texture": "#texture"}, + "up": {"uv": [1.5, 8.625, 1.25, 7.375], "texture": "#texture"}, + "down": {"uv": [1.75, 7.375, 1.5, 8.625], "texture": "#texture"} + } + }, + { + "from": [-1, 9.5, -1], + "to": [3, 16.5, 3], + "faces": { + "north": {"uv": [6.25, 0, 6.75, 0.875], "texture": "#texture"}, + "east": {"uv": [6.25, 0.875, 6.75, 1.75], "texture": "#texture"}, + "south": {"uv": [6.25, 1.75, 6.75, 2.625], "texture": "#texture"}, + "west": {"uv": [6.25, 3.875, 6.75, 4.75], "texture": "#texture"}, + "up": {"uv": [5.625, 8.375, 5.125, 7.875], "texture": "#texture"}, + "down": {"uv": [6.125, 7.875, 5.625, 8.375], "texture": "#texture"} + } + }, + { + "from": [13, 9.5, -1], + "to": [17, 16.5, 3], + "faces": { + "north": {"uv": [6.25, 4.75, 6.75, 5.625], "texture": "#texture"}, + "east": {"uv": [6.25, 5.625, 6.75, 6.5], "texture": "#texture"}, + "south": {"uv": [5.75, 6.5, 6.25, 7.375], "texture": "#texture"}, + "west": {"uv": [6.25, 6.5, 6.75, 7.375], "texture": "#texture"}, + "up": {"uv": [8.5, 0.5, 8, 0], "texture": "#texture"}, + "down": {"uv": [8.5, 0.5, 8, 1], "texture": "#texture"} + } + }, + { + "from": [13, 3, 13], + "to": [17, 6, 17], + "faces": { + "north": {"uv": [8.625, 8.25, 9.125, 8.625], "texture": "#texture"}, + "east": {"uv": [8.625, 8.625, 9.125, 9], "texture": "#texture"}, + "south": {"uv": [8.75, 2.75, 9.25, 3.125], "texture": "#texture"}, + "west": {"uv": [8.75, 3.125, 9.25, 3.5], "texture": "#texture"}, + "up": {"uv": [8.5, 1.5, 8, 1], "texture": "#texture"}, + "down": {"uv": [8.5, 1.5, 8, 2], "texture": "#texture"} + } + }, + { + "from": [-1, 3, 13], + "to": [3, 6, 17], + "faces": { + "north": {"uv": [8.75, 4.75, 9.25, 5.125], "texture": "#texture"}, + "east": {"uv": [8.75, 5.125, 9.25, 5.5], "texture": "#texture"}, + "south": {"uv": [8.75, 5.5, 9.25, 5.875], "texture": "#texture"}, + "west": {"uv": [8.75, 5.875, 9.25, 6.25], "texture": "#texture"}, + "up": {"uv": [8.5, 2.5, 8, 2], "texture": "#texture"}, + "down": {"uv": [8.5, 2.5, 8, 3], "texture": "#texture"} + } + }, + { + "from": [3, 3.5, 14], + "to": [13, 5.5, 16], + "faces": { + "north": {"uv": [3.75, 7.375, 5, 7.625], "texture": "#texture"}, + "east": {"uv": [7, 3.5, 7.25, 3.75], "texture": "#texture"}, + "south": {"uv": [0, 7.5, 1.25, 7.75], "texture": "#texture"}, + "west": {"uv": [5, 7.375, 5.25, 7.625], "texture": "#texture"}, + "up": {"uv": [8.75, 5.25, 7.5, 5], "texture": "#texture"}, + "down": {"uv": [8.75, 5.25, 7.5, 5.5], "texture": "#texture"} + } + }, + { + "from": [3, 3.5, 0], + "to": [13, 5.5, 2], + "faces": { + "north": {"uv": [7.5, 5.5, 8.75, 5.75], "texture": "#texture"}, + "east": {"uv": [8.5, 2.75, 8.75, 3], "texture": "#texture"}, + "south": {"uv": [7.5, 5.75, 8.75, 6], "texture": "#texture"}, + "west": {"uv": [8.5, 4.75, 8.75, 5], "texture": "#texture"}, + "up": {"uv": [8.75, 6.25, 7.5, 6], "texture": "#texture"}, + "down": {"uv": [8.75, 6.25, 7.5, 6.5], "texture": "#texture"} + } + }, + { + "from": [0, 3.5, 3], + "to": [2, 5.5, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 4.5, 1]}, + "faces": { + "north": {"uv": [7.75, 8.5, 8, 8.75], "texture": "#texture"}, + "east": {"uv": [7.5, 6.5, 8.75, 6.75], "texture": "#texture"}, + "south": {"uv": [0.75, 9, 1, 9.25], "texture": "#texture"}, + "west": {"uv": [7.5, 6.75, 8.75, 7], "texture": "#texture"}, + "up": {"uv": [2, 8.625, 1.75, 7.375], "texture": "#texture"}, + "down": {"uv": [2.25, 7.375, 2, 8.625], "texture": "#texture"} + } + }, + { + "from": [-1, 2.5, 5], + "to": [3, 6.5, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 4.5, 1]}, + "faces": { + "north": {"uv": [8, 3.5, 8.5, 4], "texture": "#texture"}, + "east": {"uv": [1.25, 6.875, 2, 7.375], "texture": "#texture"}, + "south": {"uv": [8, 7.75, 8.5, 8.25], "texture": "#texture"}, + "west": {"uv": [2, 6.875, 2.75, 7.375], "texture": "#texture"}, + "up": {"uv": [3.25, 7.625, 2.75, 6.875], "texture": "#texture"}, + "down": {"uv": [3.75, 6.875, 3.25, 7.625], "texture": "#texture"} + } + }, + { + "from": [13, 2.5, 5], + "to": [17, 6.5, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 4.5, 1]}, + "faces": { + "north": {"uv": [8.25, 3, 8.75, 3.5], "texture": "#texture"}, + "east": {"uv": [3.75, 6.875, 4.5, 7.375], "texture": "#texture"}, + "south": {"uv": [8, 8.25, 8.5, 8.75], "texture": "#texture"}, + "west": {"uv": [4.5, 6.875, 5.25, 7.375], "texture": "#texture"}, + "up": {"uv": [5.75, 7.625, 5.25, 6.875], "texture": "#texture"}, + "down": {"uv": [7.25, 6.875, 6.75, 7.625], "texture": "#texture"} + } + }, + { + "from": [5, 2.5, -1], + "to": [11, 6.5, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [15, 4, 8]}, + "faces": { + "north": {"uv": [7, 3, 7.75, 3.5], "texture": "#texture"}, + "east": {"uv": [3.125, 8.375, 3.625, 8.875], "texture": "#texture"}, + "south": {"uv": [7.25, 0, 8, 0.5], "texture": "#texture"}, + "west": {"uv": [3.625, 8.375, 4.125, 8.875], "texture": "#texture"}, + "up": {"uv": [8, 1, 7.25, 0.5], "texture": "#texture"}, + "down": {"uv": [8, 1, 7.25, 1.5], "texture": "#texture"} + } + }, + { + "from": [13, 6.5, -1], + "to": [17, 8.5, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [15, 4, 8]}, + "faces": { + "north": {"uv": [5.75, 7.375, 6.25, 7.625], "texture": "#texture"}, + "east": {"uv": [6.25, 7.375, 6.75, 7.625], "texture": "#texture"}, + "south": {"uv": [9.125, 7.875, 9.625, 8.125], "texture": "#texture"}, + "west": {"uv": [9.125, 8.125, 9.625, 8.375], "texture": "#texture"}, + "up": {"uv": [4.625, 8.875, 4.125, 8.375], "texture": "#texture"}, + "down": {"uv": [5.125, 8.375, 4.625, 8.875], "texture": "#texture"} + } + }, + { + "from": [13, 6.5, 13], + "to": [17, 8.5, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [15, 4, 8]}, + "faces": { + "north": {"uv": [9.125, 8.375, 9.625, 8.625], "texture": "#texture"}, + "east": {"uv": [9.125, 8.625, 9.625, 8.875], "texture": "#texture"}, + "south": {"uv": [9.25, 2.625, 9.75, 2.875], "texture": "#texture"}, + "west": {"uv": [9.25, 2.875, 9.75, 3.125], "texture": "#texture"}, + "up": {"uv": [5.625, 8.875, 5.125, 8.375], "texture": "#texture"}, + "down": {"uv": [6.125, 8.375, 5.625, 8.875], "texture": "#texture"} + } + }, + { + "from": [-1, 6.5, 13], + "to": [3, 8.5, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [15, 4, 8]}, + "faces": { + "north": {"uv": [9.25, 3.125, 9.75, 3.375], "texture": "#texture"}, + "east": {"uv": [9.25, 4.625, 9.75, 4.875], "texture": "#texture"}, + "south": {"uv": [9.25, 4.875, 9.75, 5.125], "texture": "#texture"}, + "west": {"uv": [9.25, 5.125, 9.75, 5.375], "texture": "#texture"}, + "up": {"uv": [6.625, 8.875, 6.125, 8.375], "texture": "#texture"}, + "down": {"uv": [7.125, 8.375, 6.625, 8.875], "texture": "#texture"} + } + }, + { + "from": [-1, 6.5, -1], + "to": [3, 8.5, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [15, 4, 8]}, + "faces": { + "north": {"uv": [5.25, 9.25, 5.75, 9.5], "texture": "#texture"}, + "east": {"uv": [9.25, 5.375, 9.75, 5.625], "texture": "#texture"}, + "south": {"uv": [9.25, 5.625, 9.75, 5.875], "texture": "#texture"}, + "west": {"uv": [5.75, 9.25, 6.25, 9.5], "texture": "#texture"}, + "up": {"uv": [0.5, 9, 0, 8.5], "texture": "#texture"}, + "down": {"uv": [9, 0, 8.5, 0.5], "texture": "#texture"} + } + }, + { + "from": [5, 2.5, 13], + "to": [11, 6.5, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [15, 4, 8]}, + "faces": { + "north": {"uv": [7.25, 1.5, 8, 2], "texture": "#texture"}, + "east": {"uv": [0.5, 8.5, 1, 9], "texture": "#texture"}, + "south": {"uv": [7.25, 2, 8, 2.5], "texture": "#texture"}, + "west": {"uv": [8.5, 0.5, 9, 1], "texture": "#texture"}, + "up": {"uv": [8, 3, 7.25, 2.5], "texture": "#texture"}, + "down": {"uv": [8, 3.5, 7.25, 4], "texture": "#texture"} + } + }, + { + "from": [14, 3.5, 3], + "to": [16, 5.5, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 4.5, 1]}, + "faces": { + "north": {"uv": [2.75, 9, 3, 9.25], "texture": "#texture"}, + "east": {"uv": [7.5, 7, 8.75, 7.25], "texture": "#texture"}, + "south": {"uv": [0.75, 9.25, 1, 9.5], "texture": "#texture"}, + "west": {"uv": [7.25, 7.5, 8.5, 7.75], "texture": "#texture"}, + "up": {"uv": [2.5, 8.625, 2.25, 7.375], "texture": "#texture"}, + "down": {"uv": [2.75, 7.375, 2.5, 8.625], "texture": "#texture"} + } + }, + { + "from": [0, 1, 0], + "to": [2, 16, 2], + "faces": { + "north": {"uv": [5, 3.125, 5.25, 5], "texture": "#texture"}, + "east": {"uv": [3.75, 5, 4, 6.875], "texture": "#texture"}, + "south": {"uv": [4, 5, 4.25, 6.875], "texture": "#texture"}, + "west": {"uv": [4.25, 5, 4.5, 6.875], "texture": "#texture"}, + "up": {"uv": [3, 9.5, 2.75, 9.25], "texture": "#texture"}, + "down": {"uv": [9.5, 5.875, 9.25, 6.125], "texture": "#texture"} + } + }, + { + "from": [14, 1, 0], + "to": [16, 16, 2], + "faces": { + "north": {"uv": [4.5, 5, 4.75, 6.875], "texture": "#texture"}, + "east": {"uv": [4.75, 5, 5, 6.875], "texture": "#texture"}, + "south": {"uv": [5, 5, 5.25, 6.875], "texture": "#texture"}, + "west": {"uv": [5.25, 3.125, 5.5, 5], "texture": "#texture"}, + "up": {"uv": [9.5, 6.375, 9.25, 6.125], "texture": "#texture"}, + "down": {"uv": [6.5, 9.25, 6.25, 9.5], "texture": "#texture"} + } + }, + { + "from": [14, 1, 14], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [5.25, 5, 5.5, 6.875], "texture": "#texture"}, + "east": {"uv": [5.5, 3.125, 5.75, 5], "texture": "#texture"}, + "south": {"uv": [5.5, 5, 5.75, 6.875], "texture": "#texture"}, + "west": {"uv": [0, 5.625, 0.25, 7.5], "texture": "#texture"}, + "up": {"uv": [9.5, 6.625, 9.25, 6.375], "texture": "#texture"}, + "down": {"uv": [6.75, 9.25, 6.5, 9.5], "texture": "#texture"} + } + }, + { + "from": [0, 1, 14], + "to": [2, 16, 16], + "faces": { + "north": {"uv": [0.25, 5.625, 0.5, 7.5], "texture": "#texture"}, + "east": {"uv": [0.5, 5.625, 0.75, 7.5], "texture": "#texture"}, + "south": {"uv": [0.75, 5.625, 1, 7.5], "texture": "#texture"}, + "west": {"uv": [1, 5.625, 1.25, 7.5], "texture": "#texture"}, + "up": {"uv": [9.5, 6.875, 9.25, 6.625], "texture": "#texture"}, + "down": {"uv": [7, 9.25, 6.75, 9.5], "texture": "#texture"} + } + }, + { + "from": [-0.5, 0, -0.5], + "to": [2.5, 3, 2.5], + "faces": { + "north": {"uv": [5.25, 8.875, 5.625, 9.25], "texture": "#texture"}, + "east": {"uv": [5.625, 8.875, 6, 9.25], "texture": "#texture"}, + "south": {"uv": [6, 8.875, 6.375, 9.25], "texture": "#texture"}, + "west": {"uv": [6.375, 8.875, 6.75, 9.25], "texture": "#texture"}, + "up": {"uv": [7.125, 9.25, 6.75, 8.875], "texture": "#texture"}, + "down": {"uv": [0.375, 9, 0, 9.375], "texture": "#texture"} + } + }, + { + "from": [13.5, 0, -0.5], + "to": [16.5, 3, 2.5], + "faces": { + "north": {"uv": [9, 0, 9.375, 0.375], "texture": "#texture"}, + "east": {"uv": [0.375, 9, 0.75, 9.375], "texture": "#texture"}, + "south": {"uv": [9, 0.375, 9.375, 0.75], "texture": "#texture"}, + "west": {"uv": [9, 0.75, 9.375, 1.125], "texture": "#texture"}, + "up": {"uv": [9.375, 1.5, 9, 1.125], "texture": "#texture"}, + "down": {"uv": [9.375, 1.5, 9, 1.875], "texture": "#texture"} + } + }, + { + "from": [13.5, 0, 13.5], + "to": [16.5, 3, 16.5], + "faces": { + "north": {"uv": [9, 1.875, 9.375, 2.25], "texture": "#texture"}, + "east": {"uv": [2, 9, 2.375, 9.375], "texture": "#texture"}, + "south": {"uv": [9, 2.25, 9.375, 2.625], "texture": "#texture"}, + "west": {"uv": [2.375, 9, 2.75, 9.375], "texture": "#texture"}, + "up": {"uv": [9.375, 3.875, 9, 3.5], "texture": "#texture"}, + "down": {"uv": [9.375, 3.875, 9, 4.25], "texture": "#texture"} + } + }, + { + "from": [-0.5, 0, 13.5], + "to": [2.5, 3, 16.5], + "faces": { + "north": {"uv": [8.625, 9, 9, 9.375], "texture": "#texture"}, + "east": {"uv": [9, 9, 9.375, 9.375], "texture": "#texture"}, + "south": {"uv": [1.25, 9.125, 1.625, 9.5], "texture": "#texture"}, + "west": {"uv": [1.625, 9.125, 2, 9.5], "texture": "#texture"}, + "up": {"uv": [9.5, 7.875, 9.125, 7.5], "texture": "#texture"}, + "down": {"uv": [8.125, 9.125, 7.75, 9.5], "texture": "#texture"} + } + }, + { + "from": [8, 3, 0.8], + "to": [8, 19, 15.2], + "shade": false, + "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8], "rescale": true}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#fire"}, + "east": {"uv": [0, 0, 16, 16], "texture": "#fire"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#fire"}, + "west": {"uv": [0, 0, 16, 16], "texture": "#fire"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#fire"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#fire"} + } + }, + { + "from": [0.8, 3, 8], + "to": [15.2, 19, 8], + "shade": false, + "rotation": {"angle": 45, "axis": "y", "origin": [8, 8, 8], "rescale": true}, + "faces": { + "north": {"uv": [0, 0, 16, 16], "texture": "#fire"}, + "east": {"uv": [0, 0, 16, 16], "texture": "#fire"}, + "south": {"uv": [0, 0, 16, 16], "texture": "#fire"}, + "west": {"uv": [0, 0, 16, 16], "texture": "#fire"}, + "up": {"uv": [0, 0, 16, 16], "texture": "#fire"}, + "down": {"uv": [0, 0, 16, 16], "texture": "#fire"} + } + } + ], + "groups": [ + { + "name": "coal", + "origin": [15, 4, 8], + "color": 0, + "children": [0] + }, + { + "name": "frame", + "origin": [8, 8, 8], + "color": 0, + "children": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32] + }, + { + "name": "fire", + "origin": [8, 8, 8], + "color": 0, + "children": [33, 34] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/theurgy/models/block/pyromantic_brazier_template.json b/src/main/resources/assets/theurgy/models/block/pyromantic_brazier_template.json new file mode 100644 index 000000000..7d869299d --- /dev/null +++ b/src/main/resources/assets/theurgy/models/block/pyromantic_brazier_template.json @@ -0,0 +1,433 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "texture_size": [128, 128], + "textures": { + "particle": "minecraft:block/copper_block", + "texture": "theurgy:block/liquefaction_cauldron" + }, + "elements": [ + { + "from": [3, 2, 3], + "to": [13, 4.5, 13], + "faces": { + "north": {"uv": [1.25, 5.625, 2.5, 6], "texture": "#texture"}, + "east": {"uv": [2.5, 5.625, 3.75, 6], "texture": "#texture"}, + "south": {"uv": [5.75, 3.125, 7, 3.5], "texture": "#texture"}, + "west": {"uv": [5.75, 3.5, 7, 3.875], "texture": "#texture"}, + "up": {"uv": [2.5, 5, 1.25, 3.75], "texture": "#texture"}, + "down": {"uv": [5, 1.875, 3.75, 3.125], "texture": "#texture"} + } + }, + { + "from": [-1, 3, -1], + "to": [3, 6, 3], + "faces": { + "north": {"uv": [8.75, 6.25, 9.25, 6.625], "texture": "#texture"}, + "east": {"uv": [8.75, 6.625, 9.25, 7], "texture": "#texture"}, + "south": {"uv": [8.75, 7, 9.25, 7.375], "texture": "#texture"}, + "west": {"uv": [7.75, 8.75, 8.25, 9.125], "texture": "#texture"}, + "up": {"uv": [9, 1.5, 8.5, 1], "texture": "#texture"}, + "down": {"uv": [9, 1.5, 8.5, 2], "texture": "#texture"} + } + }, + { + "from": [13, 3, -1], + "to": [17, 6, 3], + "faces": { + "north": {"uv": [8.5, 2, 9, 2.375], "texture": "#texture"}, + "east": {"uv": [8.5, 2.375, 9, 2.75], "texture": "#texture"}, + "south": {"uv": [8.5, 3.5, 9, 3.875], "texture": "#texture"}, + "west": {"uv": [8.5, 3.875, 9, 4.25], "texture": "#texture"}, + "up": {"uv": [6.75, 3.125, 6.25, 2.625], "texture": "#texture"}, + "down": {"uv": [8.25, 3, 7.75, 3.5], "texture": "#texture"} + } + }, + { + "from": [13, 9.5, 13], + "to": [17, 16.5, 17], + "faces": { + "north": {"uv": [5.75, 3.875, 6.25, 4.75], "texture": "#texture"}, + "east": {"uv": [5.75, 4.75, 6.25, 5.625], "texture": "#texture"}, + "south": {"uv": [5.75, 5.625, 6.25, 6.5], "texture": "#texture"}, + "west": {"uv": [1.25, 6, 1.75, 6.875], "texture": "#texture"}, + "up": {"uv": [3.625, 8.375, 3.125, 7.875], "texture": "#texture"}, + "down": {"uv": [4.125, 7.875, 3.625, 8.375], "texture": "#texture"} + } + }, + { + "from": [-1, 9.5, 13], + "to": [3, 16.5, 17], + "faces": { + "north": {"uv": [1.75, 6, 2.25, 6.875], "texture": "#texture"}, + "east": {"uv": [2.25, 6, 2.75, 6.875], "texture": "#texture"}, + "south": {"uv": [2.75, 6, 3.25, 6.875], "texture": "#texture"}, + "west": {"uv": [3.25, 6, 3.75, 6.875], "texture": "#texture"}, + "up": {"uv": [4.625, 8.375, 4.125, 7.875], "texture": "#texture"}, + "down": {"uv": [5.125, 7.875, 4.625, 8.375], "texture": "#texture"} + } + }, + { + "from": [3, 10.15, 14], + "to": [13, 15, 16], + "faces": { + "north": {"uv": [3.75, 4.375, 5, 5], "texture": "#texture"}, + "east": {"uv": [8.25, 8.75, 8.5, 9.375], "texture": "#texture"}, + "south": {"uv": [5, 0, 6.25, 0.625], "texture": "#texture"}, + "west": {"uv": [3, 8.875, 3.25, 9.5], "texture": "#texture"}, + "up": {"uv": [8.5, 4.25, 7.25, 4], "texture": "#texture"}, + "down": {"uv": [8.5, 4.25, 7.25, 4.5], "texture": "#texture"} + } + }, + { + "from": [3, 10.15, 0], + "to": [13, 15, 2], + "faces": { + "north": {"uv": [5, 0.625, 6.25, 1.25], "texture": "#texture"}, + "east": {"uv": [3.25, 8.875, 3.5, 9.5], "texture": "#texture"}, + "south": {"uv": [1.25, 5, 2.5, 5.625], "texture": "#texture"}, + "west": {"uv": [3.5, 8.875, 3.75, 9.5], "texture": "#texture"}, + "up": {"uv": [8.5, 4.75, 7.25, 4.5], "texture": "#texture"}, + "down": {"uv": [8.5, 4.75, 7.25, 5], "texture": "#texture"} + } + }, + { + "from": [14, 10.15, 3], + "to": [16, 15, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 27.575, 15.5]}, + "faces": { + "north": {"uv": [3.75, 8.875, 4, 9.5], "texture": "#texture"}, + "east": {"uv": [5, 1.25, 6.25, 1.875], "texture": "#texture"}, + "south": {"uv": [4, 8.875, 4.25, 9.5], "texture": "#texture"}, + "west": {"uv": [5, 1.875, 6.25, 2.5], "texture": "#texture"}, + "up": {"uv": [7.5, 6.25, 7.25, 5], "texture": "#texture"}, + "down": {"uv": [7.5, 6.25, 7.25, 7.5], "texture": "#texture"} + } + }, + { + "from": [0, 10.15, 3], + "to": [2, 15, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 27.575, 15.5]}, + "faces": { + "north": {"uv": [4.25, 8.875, 4.5, 9.5], "texture": "#texture"}, + "east": {"uv": [2.5, 5, 3.75, 5.625], "texture": "#texture"}, + "south": {"uv": [4.5, 8.875, 4.75, 9.5], "texture": "#texture"}, + "west": {"uv": [5, 2.5, 6.25, 3.125], "texture": "#texture"}, + "up": {"uv": [1.5, 8.625, 1.25, 7.375], "texture": "#texture"}, + "down": {"uv": [1.75, 7.375, 1.5, 8.625], "texture": "#texture"} + } + }, + { + "from": [-1, 9.5, -1], + "to": [3, 16.5, 3], + "faces": { + "north": {"uv": [6.25, 0, 6.75, 0.875], "texture": "#texture"}, + "east": {"uv": [6.25, 0.875, 6.75, 1.75], "texture": "#texture"}, + "south": {"uv": [6.25, 1.75, 6.75, 2.625], "texture": "#texture"}, + "west": {"uv": [6.25, 3.875, 6.75, 4.75], "texture": "#texture"}, + "up": {"uv": [5.625, 8.375, 5.125, 7.875], "texture": "#texture"}, + "down": {"uv": [6.125, 7.875, 5.625, 8.375], "texture": "#texture"} + } + }, + { + "from": [13, 9.5, -1], + "to": [17, 16.5, 3], + "faces": { + "north": {"uv": [6.25, 4.75, 6.75, 5.625], "texture": "#texture"}, + "east": {"uv": [6.25, 5.625, 6.75, 6.5], "texture": "#texture"}, + "south": {"uv": [5.75, 6.5, 6.25, 7.375], "texture": "#texture"}, + "west": {"uv": [6.25, 6.5, 6.75, 7.375], "texture": "#texture"}, + "up": {"uv": [8.5, 0.5, 8, 0], "texture": "#texture"}, + "down": {"uv": [8.5, 0.5, 8, 1], "texture": "#texture"} + } + }, + { + "from": [13, 3, 13], + "to": [17, 6, 17], + "faces": { + "north": {"uv": [8.625, 8.25, 9.125, 8.625], "texture": "#texture"}, + "east": {"uv": [8.625, 8.625, 9.125, 9], "texture": "#texture"}, + "south": {"uv": [8.75, 2.75, 9.25, 3.125], "texture": "#texture"}, + "west": {"uv": [8.75, 3.125, 9.25, 3.5], "texture": "#texture"}, + "up": {"uv": [8.5, 1.5, 8, 1], "texture": "#texture"}, + "down": {"uv": [8.5, 1.5, 8, 2], "texture": "#texture"} + } + }, + { + "from": [-1, 3, 13], + "to": [3, 6, 17], + "faces": { + "north": {"uv": [8.75, 4.75, 9.25, 5.125], "texture": "#texture"}, + "east": {"uv": [8.75, 5.125, 9.25, 5.5], "texture": "#texture"}, + "south": {"uv": [8.75, 5.5, 9.25, 5.875], "texture": "#texture"}, + "west": {"uv": [8.75, 5.875, 9.25, 6.25], "texture": "#texture"}, + "up": {"uv": [8.5, 2.5, 8, 2], "texture": "#texture"}, + "down": {"uv": [8.5, 2.5, 8, 3], "texture": "#texture"} + } + }, + { + "from": [3, 3.5, 14], + "to": [13, 5.5, 16], + "faces": { + "north": {"uv": [3.75, 7.375, 5, 7.625], "texture": "#texture"}, + "east": {"uv": [7, 3.5, 7.25, 3.75], "texture": "#texture"}, + "south": {"uv": [0, 7.5, 1.25, 7.75], "texture": "#texture"}, + "west": {"uv": [5, 7.375, 5.25, 7.625], "texture": "#texture"}, + "up": {"uv": [8.75, 5.25, 7.5, 5], "texture": "#texture"}, + "down": {"uv": [8.75, 5.25, 7.5, 5.5], "texture": "#texture"} + } + }, + { + "from": [3, 3.5, 0], + "to": [13, 5.5, 2], + "faces": { + "north": {"uv": [7.5, 5.5, 8.75, 5.75], "texture": "#texture"}, + "east": {"uv": [8.5, 2.75, 8.75, 3], "texture": "#texture"}, + "south": {"uv": [7.5, 5.75, 8.75, 6], "texture": "#texture"}, + "west": {"uv": [8.5, 4.75, 8.75, 5], "texture": "#texture"}, + "up": {"uv": [8.75, 6.25, 7.5, 6], "texture": "#texture"}, + "down": {"uv": [8.75, 6.25, 7.5, 6.5], "texture": "#texture"} + } + }, + { + "from": [0, 3.5, 3], + "to": [2, 5.5, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 4.5, 1]}, + "faces": { + "north": {"uv": [7.75, 8.5, 8, 8.75], "texture": "#texture"}, + "east": {"uv": [7.5, 6.5, 8.75, 6.75], "texture": "#texture"}, + "south": {"uv": [0.75, 9, 1, 9.25], "texture": "#texture"}, + "west": {"uv": [7.5, 6.75, 8.75, 7], "texture": "#texture"}, + "up": {"uv": [2, 8.625, 1.75, 7.375], "texture": "#texture"}, + "down": {"uv": [2.25, 7.375, 2, 8.625], "texture": "#texture"} + } + }, + { + "from": [-1, 2.5, 5], + "to": [3, 6.5, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 4.5, 1]}, + "faces": { + "north": {"uv": [8, 3.5, 8.5, 4], "texture": "#texture"}, + "east": {"uv": [1.25, 6.875, 2, 7.375], "texture": "#texture"}, + "south": {"uv": [8, 7.75, 8.5, 8.25], "texture": "#texture"}, + "west": {"uv": [2, 6.875, 2.75, 7.375], "texture": "#texture"}, + "up": {"uv": [3.25, 7.625, 2.75, 6.875], "texture": "#texture"}, + "down": {"uv": [3.75, 6.875, 3.25, 7.625], "texture": "#texture"} + } + }, + { + "from": [13, 2.5, 5], + "to": [17, 6.5, 11], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 4.5, 1]}, + "faces": { + "north": {"uv": [8.25, 3, 8.75, 3.5], "texture": "#texture"}, + "east": {"uv": [3.75, 6.875, 4.5, 7.375], "texture": "#texture"}, + "south": {"uv": [8, 8.25, 8.5, 8.75], "texture": "#texture"}, + "west": {"uv": [4.5, 6.875, 5.25, 7.375], "texture": "#texture"}, + "up": {"uv": [5.75, 7.625, 5.25, 6.875], "texture": "#texture"}, + "down": {"uv": [7.25, 6.875, 6.75, 7.625], "texture": "#texture"} + } + }, + { + "from": [5, 2.5, -1], + "to": [11, 6.5, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [15, 4, 8]}, + "faces": { + "north": {"uv": [7, 3, 7.75, 3.5], "texture": "#texture"}, + "east": {"uv": [3.125, 8.375, 3.625, 8.875], "texture": "#texture"}, + "south": {"uv": [7.25, 0, 8, 0.5], "texture": "#texture"}, + "west": {"uv": [3.625, 8.375, 4.125, 8.875], "texture": "#texture"}, + "up": {"uv": [8, 1, 7.25, 0.5], "texture": "#texture"}, + "down": {"uv": [8, 1, 7.25, 1.5], "texture": "#texture"} + } + }, + { + "from": [13, 6.5, -1], + "to": [17, 8.5, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [15, 4, 8]}, + "faces": { + "north": {"uv": [5.75, 7.375, 6.25, 7.625], "texture": "#texture"}, + "east": {"uv": [6.25, 7.375, 6.75, 7.625], "texture": "#texture"}, + "south": {"uv": [9.125, 7.875, 9.625, 8.125], "texture": "#texture"}, + "west": {"uv": [9.125, 8.125, 9.625, 8.375], "texture": "#texture"}, + "up": {"uv": [4.625, 8.875, 4.125, 8.375], "texture": "#texture"}, + "down": {"uv": [5.125, 8.375, 4.625, 8.875], "texture": "#texture"} + } + }, + { + "from": [13, 6.5, 13], + "to": [17, 8.5, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [15, 4, 8]}, + "faces": { + "north": {"uv": [9.125, 8.375, 9.625, 8.625], "texture": "#texture"}, + "east": {"uv": [9.125, 8.625, 9.625, 8.875], "texture": "#texture"}, + "south": {"uv": [9.25, 2.625, 9.75, 2.875], "texture": "#texture"}, + "west": {"uv": [9.25, 2.875, 9.75, 3.125], "texture": "#texture"}, + "up": {"uv": [5.625, 8.875, 5.125, 8.375], "texture": "#texture"}, + "down": {"uv": [6.125, 8.375, 5.625, 8.875], "texture": "#texture"} + } + }, + { + "from": [-1, 6.5, 13], + "to": [3, 8.5, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [15, 4, 8]}, + "faces": { + "north": {"uv": [9.25, 3.125, 9.75, 3.375], "texture": "#texture"}, + "east": {"uv": [9.25, 4.625, 9.75, 4.875], "texture": "#texture"}, + "south": {"uv": [9.25, 4.875, 9.75, 5.125], "texture": "#texture"}, + "west": {"uv": [9.25, 5.125, 9.75, 5.375], "texture": "#texture"}, + "up": {"uv": [6.625, 8.875, 6.125, 8.375], "texture": "#texture"}, + "down": {"uv": [7.125, 8.375, 6.625, 8.875], "texture": "#texture"} + } + }, + { + "from": [-1, 6.5, -1], + "to": [3, 8.5, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [15, 4, 8]}, + "faces": { + "north": {"uv": [5.25, 9.25, 5.75, 9.5], "texture": "#texture"}, + "east": {"uv": [9.25, 5.375, 9.75, 5.625], "texture": "#texture"}, + "south": {"uv": [9.25, 5.625, 9.75, 5.875], "texture": "#texture"}, + "west": {"uv": [5.75, 9.25, 6.25, 9.5], "texture": "#texture"}, + "up": {"uv": [0.5, 9, 0, 8.5], "texture": "#texture"}, + "down": {"uv": [9, 0, 8.5, 0.5], "texture": "#texture"} + } + }, + { + "from": [5, 2.5, 13], + "to": [11, 6.5, 17], + "rotation": {"angle": 0, "axis": "y", "origin": [15, 4, 8]}, + "faces": { + "north": {"uv": [7.25, 1.5, 8, 2], "texture": "#texture"}, + "east": {"uv": [0.5, 8.5, 1, 9], "texture": "#texture"}, + "south": {"uv": [7.25, 2, 8, 2.5], "texture": "#texture"}, + "west": {"uv": [8.5, 0.5, 9, 1], "texture": "#texture"}, + "up": {"uv": [8, 3, 7.25, 2.5], "texture": "#texture"}, + "down": {"uv": [8, 3.5, 7.25, 4], "texture": "#texture"} + } + }, + { + "from": [14, 3.5, 3], + "to": [16, 5.5, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 4.5, 1]}, + "faces": { + "north": {"uv": [2.75, 9, 3, 9.25], "texture": "#texture"}, + "east": {"uv": [7.5, 7, 8.75, 7.25], "texture": "#texture"}, + "south": {"uv": [0.75, 9.25, 1, 9.5], "texture": "#texture"}, + "west": {"uv": [7.25, 7.5, 8.5, 7.75], "texture": "#texture"}, + "up": {"uv": [2.5, 8.625, 2.25, 7.375], "texture": "#texture"}, + "down": {"uv": [2.75, 7.375, 2.5, 8.625], "texture": "#texture"} + } + }, + { + "from": [0, 1, 0], + "to": [2, 16, 2], + "faces": { + "north": {"uv": [5, 3.125, 5.25, 5], "texture": "#texture"}, + "east": {"uv": [3.75, 5, 4, 6.875], "texture": "#texture"}, + "south": {"uv": [4, 5, 4.25, 6.875], "texture": "#texture"}, + "west": {"uv": [4.25, 5, 4.5, 6.875], "texture": "#texture"}, + "up": {"uv": [3, 9.5, 2.75, 9.25], "texture": "#texture"}, + "down": {"uv": [9.5, 5.875, 9.25, 6.125], "texture": "#texture"} + } + }, + { + "from": [14, 1, 0], + "to": [16, 16, 2], + "faces": { + "north": {"uv": [4.5, 5, 4.75, 6.875], "texture": "#texture"}, + "east": {"uv": [4.75, 5, 5, 6.875], "texture": "#texture"}, + "south": {"uv": [5, 5, 5.25, 6.875], "texture": "#texture"}, + "west": {"uv": [5.25, 3.125, 5.5, 5], "texture": "#texture"}, + "up": {"uv": [9.5, 6.375, 9.25, 6.125], "texture": "#texture"}, + "down": {"uv": [6.5, 9.25, 6.25, 9.5], "texture": "#texture"} + } + }, + { + "from": [14, 1, 14], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [5.25, 5, 5.5, 6.875], "texture": "#texture"}, + "east": {"uv": [5.5, 3.125, 5.75, 5], "texture": "#texture"}, + "south": {"uv": [5.5, 5, 5.75, 6.875], "texture": "#texture"}, + "west": {"uv": [0, 5.625, 0.25, 7.5], "texture": "#texture"}, + "up": {"uv": [9.5, 6.625, 9.25, 6.375], "texture": "#texture"}, + "down": {"uv": [6.75, 9.25, 6.5, 9.5], "texture": "#texture"} + } + }, + { + "from": [0, 1, 14], + "to": [2, 16, 16], + "faces": { + "north": {"uv": [0.25, 5.625, 0.5, 7.5], "texture": "#texture"}, + "east": {"uv": [0.5, 5.625, 0.75, 7.5], "texture": "#texture"}, + "south": {"uv": [0.75, 5.625, 1, 7.5], "texture": "#texture"}, + "west": {"uv": [1, 5.625, 1.25, 7.5], "texture": "#texture"}, + "up": {"uv": [9.5, 6.875, 9.25, 6.625], "texture": "#texture"}, + "down": {"uv": [7, 9.25, 6.75, 9.5], "texture": "#texture"} + } + }, + { + "from": [-0.5, 0, -0.5], + "to": [2.5, 3, 2.5], + "faces": { + "north": {"uv": [5.25, 8.875, 5.625, 9.25], "texture": "#texture"}, + "east": {"uv": [5.625, 8.875, 6, 9.25], "texture": "#texture"}, + "south": {"uv": [6, 8.875, 6.375, 9.25], "texture": "#texture"}, + "west": {"uv": [6.375, 8.875, 6.75, 9.25], "texture": "#texture"}, + "up": {"uv": [7.125, 9.25, 6.75, 8.875], "texture": "#texture"}, + "down": {"uv": [0.375, 9, 0, 9.375], "texture": "#texture"} + } + }, + { + "from": [13.5, 0, -0.5], + "to": [16.5, 3, 2.5], + "faces": { + "north": {"uv": [9, 0, 9.375, 0.375], "texture": "#texture"}, + "east": {"uv": [0.375, 9, 0.75, 9.375], "texture": "#texture"}, + "south": {"uv": [9, 0.375, 9.375, 0.75], "texture": "#texture"}, + "west": {"uv": [9, 0.75, 9.375, 1.125], "texture": "#texture"}, + "up": {"uv": [9.375, 1.5, 9, 1.125], "texture": "#texture"}, + "down": {"uv": [9.375, 1.5, 9, 1.875], "texture": "#texture"} + } + }, + { + "from": [13.5, 0, 13.5], + "to": [16.5, 3, 16.5], + "faces": { + "north": {"uv": [9, 1.875, 9.375, 2.25], "texture": "#texture"}, + "east": {"uv": [2, 9, 2.375, 9.375], "texture": "#texture"}, + "south": {"uv": [9, 2.25, 9.375, 2.625], "texture": "#texture"}, + "west": {"uv": [2.375, 9, 2.75, 9.375], "texture": "#texture"}, + "up": {"uv": [9.375, 3.875, 9, 3.5], "texture": "#texture"}, + "down": {"uv": [9.375, 3.875, 9, 4.25], "texture": "#texture"} + } + }, + { + "from": [-0.5, 0, 13.5], + "to": [2.5, 3, 16.5], + "faces": { + "north": {"uv": [8.625, 9, 9, 9.375], "texture": "#texture"}, + "east": {"uv": [9, 9, 9.375, 9.375], "texture": "#texture"}, + "south": {"uv": [1.25, 9.125, 1.625, 9.5], "texture": "#texture"}, + "west": {"uv": [1.625, 9.125, 2, 9.5], "texture": "#texture"}, + "up": {"uv": [9.5, 7.875, 9.125, 7.5], "texture": "#texture"}, + "down": {"uv": [8.125, 9.125, 7.75, 9.5], "texture": "#texture"} + } + } + ], + "groups": [ + { + "name": "coal", + "origin": [15, 4, 8], + "color": 0, + "children": [0] + }, + { + "name": "frame", + "origin": [8, 8, 8], + "color": 0, + "children": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/theurgy/models/block/sal_ammoniac_accumulator_template.json b/src/main/resources/assets/theurgy/models/block/sal_ammoniac_accumulator_template.json new file mode 100644 index 000000000..c34781bdd --- /dev/null +++ b/src/main/resources/assets/theurgy/models/block/sal_ammoniac_accumulator_template.json @@ -0,0 +1,270 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "texture_size": [64, 64], + "textures": { + "particle": "sal_ammoniac_accumulator", + "texture": "sal_ammoniac_accumulator" + }, + "elements": [ + { + "from": [14, 0, 0], + "to": [16, 16, 2], + "faces": { + "north": {"uv": [1.5, 8.25, 2, 12.25], "texture": "#texture"}, + "east": {"uv": [2, 8.25, 2.5, 12.25], "texture": "#texture"}, + "south": {"uv": [2.5, 8.25, 3, 12.25], "texture": "#texture"}, + "west": {"uv": [3, 8.25, 3.5, 12.25], "texture": "#texture"}, + "up": {"uv": [11.5, 3.25, 11, 2.75], "texture": "#texture"}, + "down": {"uv": [11.5, 3.25, 11, 3.75], "texture": "#texture"} + } + }, + { + "from": [0, 0, 0], + "to": [2, 16, 2], + "faces": { + "north": {"uv": [4, 5.5, 4.5, 9.5], "texture": "#texture"}, + "east": {"uv": [4.5, 5.5, 5, 9.5], "texture": "#texture"}, + "south": {"uv": [5, 7.75, 5.5, 11.75], "texture": "#texture"}, + "west": {"uv": [5.5, 7.75, 6, 11.75], "texture": "#texture"}, + "up": {"uv": [10.25, 2.75, 9.75, 2.25], "texture": "#texture"}, + "down": {"uv": [11, 7.5, 10.5, 8], "texture": "#texture"} + } + }, + { + "from": [0, 0, 14], + "to": [2, 16, 16], + "faces": { + "north": {"uv": [6, 7.75, 6.5, 11.75], "texture": "#texture"}, + "east": {"uv": [6.5, 7.75, 7, 11.75], "texture": "#texture"}, + "south": {"uv": [7, 7.75, 7.5, 11.75], "texture": "#texture"}, + "west": {"uv": [7.5, 7.75, 8, 11.75], "texture": "#texture"}, + "up": {"uv": [11, 8.5, 10.5, 8], "texture": "#texture"}, + "down": {"uv": [11, 8.5, 10.5, 9], "texture": "#texture"} + } + }, + { + "from": [14, 0, 14], + "to": [16, 16, 16], + "faces": { + "north": {"uv": [8, 7.75, 8.5, 11.75], "texture": "#texture"}, + "east": {"uv": [0, 8.25, 0.5, 12.25], "texture": "#texture"}, + "south": {"uv": [0.5, 8.25, 1, 12.25], "texture": "#texture"}, + "west": {"uv": [1, 8.25, 1.5, 12.25], "texture": "#texture"}, + "up": {"uv": [11, 11.25, 10.5, 10.75], "texture": "#texture"}, + "down": {"uv": [11.5, 2.25, 11, 2.75], "texture": "#texture"} + } + }, + { + "from": [6, 0, 6], + "to": [10, 2, 10], + "faces": { + "north": {"uv": [10.25, 4.5, 11.25, 5], "texture": "#texture"}, + "east": {"uv": [10.5, 0.75, 11.5, 1.25], "texture": "#texture"}, + "south": {"uv": [10.5, 1.25, 11.5, 1.75], "texture": "#texture"}, + "west": {"uv": [10.5, 1.75, 11.5, 2.25], "texture": "#texture"}, + "up": {"uv": [8.5, 5, 7.5, 4], "texture": "#texture"}, + "down": {"uv": [9.5, 4, 8.5, 5], "texture": "#texture"} + } + }, + { + "from": [4, 2, 4], + "to": [12, 4, 12], + "faces": { + "north": {"uv": [8.5, 7.75, 10.5, 8.25], "texture": "#texture"}, + "east": {"uv": [8.5, 8.25, 10.5, 8.75], "texture": "#texture"}, + "south": {"uv": [8.5, 8.75, 10.5, 9.25], "texture": "#texture"}, + "west": {"uv": [9, 5, 11, 5.5], "texture": "#texture"}, + "up": {"uv": [9.5, 2, 7.5, 0], "texture": "#texture"}, + "down": {"uv": [9.5, 2, 7.5, 4], "texture": "#texture"} + } + }, + { + "name": "Tank", + "from": [3, 4, 3], + "to": [13, 5, 13], + "faces": { + "north": {"uv": [9, 5.5, 11.5, 5.75], "texture": "#texture"}, + "east": {"uv": [9, 5.75, 11.5, 6], "texture": "#texture"}, + "south": {"uv": [9, 6, 11.5, 6.25], "texture": "#texture"}, + "west": {"uv": [9, 6.25, 11.5, 6.5], "texture": "#texture"}, + "up": {"uv": [7.5, 2.5, 5, 0], "texture": "#texture"}, + "down": {"uv": [7.5, 2.5, 5, 5], "texture": "#texture"} + } + }, + { + "name": "Tank", + "from": [3, 5, 12], + "to": [13, 16, 13], + "faces": { + "north": {"uv": [0, 0, 2.5, 2.75], "texture": "#texture"}, + "east": {"uv": [3.5, 8.25, 3.75, 11], "texture": "#texture"}, + "south": {"uv": [2.5, 0, 5, 2.75], "texture": "#texture"}, + "west": {"uv": [3.75, 8.25, 4, 11], "texture": "#texture"}, + "up": {"uv": [11.5, 6.75, 9, 6.5], "texture": "#texture"}, + "down": {"uv": [11.5, 6.75, 9, 7], "texture": "#texture"} + } + }, + { + "name": "Tank", + "from": [3, 5, 3], + "to": [13, 16, 4], + "faces": { + "north": {"uv": [0, 2.75, 2.5, 5.5], "texture": "#texture"}, + "east": {"uv": [8.5, 9.25, 8.75, 12], "texture": "#texture"}, + "south": {"uv": [2.5, 2.75, 5, 5.5], "texture": "#texture"}, + "west": {"uv": [8.75, 9.25, 9, 12], "texture": "#texture"}, + "up": {"uv": [11.5, 7.25, 9, 7], "texture": "#texture"}, + "down": {"uv": [11.5, 7.25, 9, 7.5], "texture": "#texture"} + } + }, + { + "name": "Tank", + "from": [12, 5, 4], + "to": [13, 16, 12], + "faces": { + "north": {"uv": [9, 9.25, 9.25, 12], "texture": "#texture"}, + "east": {"uv": [5, 5, 7, 7.75], "texture": "#texture"}, + "south": {"uv": [9.25, 9.25, 9.5, 12], "texture": "#texture"}, + "west": {"uv": [0, 5.5, 2, 8.25], "texture": "#texture"}, + "up": {"uv": [9.75, 12.75, 9.5, 10.75], "texture": "#texture"}, + "down": {"uv": [10, 10.75, 9.75, 12.75], "texture": "#texture"} + } + }, + { + "name": "Tank", + "from": [3, 5, 4], + "to": [4, 16, 12], + "faces": { + "north": {"uv": [9.5, 0, 9.75, 2.75], "texture": "#texture"}, + "east": {"uv": [2, 5.5, 4, 8.25], "texture": "#texture"}, + "south": {"uv": [4, 9.5, 4.25, 12.25], "texture": "#texture"}, + "west": {"uv": [7, 5, 9, 7.75], "texture": "#texture"}, + "up": {"uv": [10.25, 12.75, 10, 10.75], "texture": "#texture"}, + "down": {"uv": [10.5, 10.75, 10.25, 12.75], "texture": "#texture"} + } + }, + { + "from": [1, 14, 1], + "to": [4, 15, 4], + "faces": { + "north": {"uv": [9, 7.5, 9.75, 7.75], "texture": "#texture"}, + "east": {"uv": [9.75, 7.5, 10.5, 7.75], "texture": "#texture"}, + "south": {"uv": [10.5, 9, 11.25, 9.25], "texture": "#texture"}, + "west": {"uv": [11, 3.75, 11.75, 4], "texture": "#texture"}, + "up": {"uv": [10.25, 3.5, 9.5, 2.75], "texture": "#texture"}, + "down": {"uv": [10.25, 3.5, 9.5, 4.25], "texture": "#texture"} + } + }, + { + "from": [12, 14, 1], + "to": [15, 15, 4], + "faces": { + "north": {"uv": [11, 4, 11.75, 4.25], "texture": "#texture"}, + "east": {"uv": [4.25, 11, 5, 11.25], "texture": "#texture"}, + "south": {"uv": [11, 4.25, 11.75, 4.5], "texture": "#texture"}, + "west": {"uv": [11, 5, 11.75, 5.25], "texture": "#texture"}, + "up": {"uv": [5, 10.25, 4.25, 9.5], "texture": "#texture"}, + "down": {"uv": [10.25, 4.25, 9.5, 5], "texture": "#texture"} + } + }, + { + "from": [12, 14, 12], + "to": [15, 15, 15], + "faces": { + "north": {"uv": [11, 5.25, 11.75, 5.5], "texture": "#texture"}, + "east": {"uv": [11, 7.5, 11.75, 7.75], "texture": "#texture"}, + "south": {"uv": [11, 7.75, 11.75, 8], "texture": "#texture"}, + "west": {"uv": [11, 8, 11.75, 8.25], "texture": "#texture"}, + "up": {"uv": [10.25, 10, 9.5, 9.25], "texture": "#texture"}, + "down": {"uv": [10.5, 0, 9.75, 0.75], "texture": "#texture"} + } + }, + { + "from": [1, 14, 12], + "to": [4, 15, 15], + "faces": { + "north": {"uv": [11, 8.25, 11.75, 8.5], "texture": "#texture"}, + "east": {"uv": [11, 8.5, 11.75, 8.75], "texture": "#texture"}, + "south": {"uv": [11, 8.75, 11.75, 9], "texture": "#texture"}, + "west": {"uv": [11, 9.25, 11.75, 9.5], "texture": "#texture"}, + "up": {"uv": [10.5, 1.5, 9.75, 0.75], "texture": "#texture"}, + "down": {"uv": [10.5, 1.5, 9.75, 2.25], "texture": "#texture"} + } + }, + { + "from": [1, 5, 1], + "to": [4, 6, 4], + "faces": { + "north": {"uv": [11.25, 4.75, 12, 5], "texture": "#texture"}, + "east": {"uv": [11.25, 9, 12, 9.25], "texture": "#texture"}, + "south": {"uv": [10.5, 11.25, 11.25, 11.5], "texture": "#texture"}, + "west": {"uv": [11.25, 11.25, 12, 11.5], "texture": "#texture"}, + "up": {"uv": [11, 10.75, 10.25, 10], "texture": "#texture"}, + "down": {"uv": [11.25, 0, 10.5, 0.75], "texture": "#texture"} + } + }, + { + "from": [12, 5, 1], + "to": [15, 6, 4], + "faces": { + "north": {"uv": [11.25, 0.25, 12, 0.5], "texture": "#texture"}, + "east": {"uv": [11.25, 0.5, 12, 0.75], "texture": "#texture"}, + "south": {"uv": [4.25, 11.25, 5, 11.5], "texture": "#texture"}, + "west": {"uv": [11.25, 4.5, 12, 4.75], "texture": "#texture"}, + "up": {"uv": [5, 11, 4.25, 10.25], "texture": "#texture"}, + "down": {"uv": [11, 9.25, 10.25, 10], "texture": "#texture"} + } + }, + { + "from": [12, 5, 12], + "to": [15, 6, 15], + "faces": { + "north": {"uv": [11, 10.5, 11.75, 10.75], "texture": "#texture"}, + "east": {"uv": [11, 10.75, 11.75, 11], "texture": "#texture"}, + "south": {"uv": [11, 11, 11.75, 11.25], "texture": "#texture"}, + "west": {"uv": [11.25, 0, 12, 0.25], "texture": "#texture"}, + "up": {"uv": [11, 3.75, 10.25, 3], "texture": "#texture"}, + "down": {"uv": [11, 3.75, 10.25, 4.5], "texture": "#texture"} + } + }, + { + "from": [1, 5, 12], + "to": [4, 6, 15], + "faces": { + "north": {"uv": [11, 9.5, 11.75, 9.75], "texture": "#texture"}, + "east": {"uv": [11, 9.75, 11.75, 10], "texture": "#texture"}, + "south": {"uv": [11, 10, 11.75, 10.25], "texture": "#texture"}, + "west": {"uv": [11, 10.25, 11.75, 10.5], "texture": "#texture"}, + "up": {"uv": [10.25, 10.75, 9.5, 10], "texture": "#texture"}, + "down": {"uv": [11, 2.25, 10.25, 3], "texture": "#texture"} + } + } + ], + "groups": [ + { + "name": "Frame", + "origin": [0, 0, 0], + "color": 0, + "children": [0, 1, 2, 3] + }, + { + "name": "filter", + "origin": [0, 0, 0], + "color": 0, + "children": [4, 5] + }, + { + "name": "Tank", + "origin": [0, 0, 0], + "color": 0, + "children": [6, 7, 8, 9, 10] + }, + { + "name": "Frame-Connectors", + "origin": [0, 0, 0], + "color": 0, + "children": [11, 12, 13, 14, 15, 16, 17, 18] + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/theurgy/models/item/sal_ammoniac_bucket.json b/src/main/resources/assets/theurgy/models/item/sal_ammoniac_bucket.json new file mode 100644 index 000000000..b4b3f5cd0 --- /dev/null +++ b/src/main/resources/assets/theurgy/models/item/sal_ammoniac_bucket.json @@ -0,0 +1,5 @@ +{ + "parent": "forge:item/bucket", + "loader": "forge:fluid_container", + "fluid": "theurgy:sal_ammoniac" +} \ No newline at end of file diff --git a/src/main/resources/assets/theurgy/particles/colored_bubble.json b/src/main/resources/assets/theurgy/particles/colored_bubble.json new file mode 100644 index 000000000..2137a24e0 --- /dev/null +++ b/src/main/resources/assets/theurgy/particles/colored_bubble.json @@ -0,0 +1,12 @@ +{ + "textures": [ + "theurgy:bubble", + "theurgy:bubble", + "theurgy:bubble", + "theurgy:bubble", + "theurgy:bubble", + "theurgy:bubble_pop_0", + "theurgy:bubble_pop_1", + "theurgy:bubble_pop_2" + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/theurgy/textures/block/calcination_oven.png b/src/main/resources/assets/theurgy/textures/block/calcination_oven.png new file mode 100644 index 000000000..11ef3e03e Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/block/calcination_oven.png differ diff --git a/src/main/resources/assets/theurgy/textures/block/deepslate_sal_ammoniac_ore.png b/src/main/resources/assets/theurgy/textures/block/deepslate_sal_ammoniac_ore.png new file mode 100644 index 000000000..aa4241790 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/block/deepslate_sal_ammoniac_ore.png differ diff --git a/src/main/resources/assets/theurgy/textures/block/distiller.png b/src/main/resources/assets/theurgy/textures/block/distiller.png new file mode 100644 index 000000000..e35a96cd9 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/block/distiller.png differ diff --git a/src/main/resources/assets/theurgy/textures/block/incubator.png b/src/main/resources/assets/theurgy/textures/block/incubator.png new file mode 100644 index 000000000..ed232336d Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/block/incubator.png differ diff --git a/src/main/resources/assets/theurgy/textures/block/incubator_gold.png b/src/main/resources/assets/theurgy/textures/block/incubator_gold.png new file mode 100644 index 000000000..42896b7f0 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/block/incubator_gold.png differ diff --git a/src/main/resources/assets/theurgy/textures/block/incubator_pipe.png b/src/main/resources/assets/theurgy/textures/block/incubator_pipe.png new file mode 100644 index 000000000..4b8b48a5a Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/block/incubator_pipe.png differ diff --git a/src/main/resources/assets/theurgy/textures/block/incubator_vessel_bronze.png b/src/main/resources/assets/theurgy/textures/block/incubator_vessel_bronze.png new file mode 100644 index 000000000..e9129b2a9 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/block/incubator_vessel_bronze.png differ diff --git a/src/main/resources/assets/theurgy/textures/block/incubator_vessel_gold.png b/src/main/resources/assets/theurgy/textures/block/incubator_vessel_gold.png new file mode 100644 index 000000000..d1192fd45 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/block/incubator_vessel_gold.png differ diff --git a/src/main/resources/assets/theurgy/textures/block/incubator_vessel_iron.png b/src/main/resources/assets/theurgy/textures/block/incubator_vessel_iron.png new file mode 100644 index 000000000..d70635a6d Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/block/incubator_vessel_iron.png differ diff --git a/src/main/resources/assets/theurgy/textures/block/liquefaction_cauldron.png b/src/main/resources/assets/theurgy/textures/block/liquefaction_cauldron.png new file mode 100644 index 000000000..6e8f34ac6 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/block/liquefaction_cauldron.png differ diff --git a/src/main/resources/assets/theurgy/textures/block/pyromantic_brazier.png b/src/main/resources/assets/theurgy/textures/block/pyromantic_brazier.png new file mode 100644 index 000000000..5515803d7 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/block/pyromantic_brazier.png differ diff --git a/src/main/resources/assets/theurgy/textures/block/pyromantic_brazier_lit.png b/src/main/resources/assets/theurgy/textures/block/pyromantic_brazier_lit.png new file mode 100644 index 000000000..59e21e73a Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/block/pyromantic_brazier_lit.png differ diff --git a/src/main/resources/assets/theurgy/textures/block/sal_ammoniac/flow.png b/src/main/resources/assets/theurgy/textures/block/sal_ammoniac/flow.png new file mode 100644 index 000000000..2b90e8aa6 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/block/sal_ammoniac/flow.png differ diff --git a/src/main/resources/assets/theurgy/textures/block/sal_ammoniac/flow.png.mcmeta b/src/main/resources/assets/theurgy/textures/block/sal_ammoniac/flow.png.mcmeta new file mode 100644 index 000000000..4f0718ac9 --- /dev/null +++ b/src/main/resources/assets/theurgy/textures/block/sal_ammoniac/flow.png.mcmeta @@ -0,0 +1,3 @@ +{ + "animation": {} +} \ No newline at end of file diff --git a/src/main/resources/assets/theurgy/textures/block/sal_ammoniac/overlay.png b/src/main/resources/assets/theurgy/textures/block/sal_ammoniac/overlay.png new file mode 100644 index 000000000..c6f2fa982 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/block/sal_ammoniac/overlay.png differ diff --git a/src/main/resources/assets/theurgy/textures/block/sal_ammoniac/still.png b/src/main/resources/assets/theurgy/textures/block/sal_ammoniac/still.png new file mode 100644 index 000000000..416016262 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/block/sal_ammoniac/still.png differ diff --git a/src/main/resources/assets/theurgy/textures/block/sal_ammoniac/still.png.mcmeta b/src/main/resources/assets/theurgy/textures/block/sal_ammoniac/still.png.mcmeta new file mode 100644 index 000000000..0645f48c6 --- /dev/null +++ b/src/main/resources/assets/theurgy/textures/block/sal_ammoniac/still.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 2 + } +} diff --git a/src/main/resources/assets/theurgy/textures/block/sal_ammoniac_accumulator.png b/src/main/resources/assets/theurgy/textures/block/sal_ammoniac_accumulator.png new file mode 100644 index 000000000..58f4a5c41 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/block/sal_ammoniac_accumulator.png differ diff --git a/src/main/resources/assets/theurgy/textures/block/sal_ammoniac_ore.png b/src/main/resources/assets/theurgy/textures/block/sal_ammoniac_ore.png new file mode 100644 index 000000000..9d397af1d Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/block/sal_ammoniac_ore.png differ diff --git a/src/main/resources/assets/theurgy/textures/block/sal_ammoniac_tank.png b/src/main/resources/assets/theurgy/textures/block/sal_ammoniac_tank.png new file mode 100644 index 000000000..7996e24ce Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/block/sal_ammoniac_tank.png differ diff --git a/src/main/resources/assets/theurgy/textures/gui/book/256.png b/src/main/resources/assets/theurgy/textures/gui/book/256.png new file mode 100644 index 000000000..0d2e6e463 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/gui/book/256.png differ diff --git a/src/main/resources/assets/theurgy/textures/gui/book/bg_nightsky.png b/src/main/resources/assets/theurgy/textures/gui/book/bg_nightsky.png new file mode 100644 index 000000000..7aa6b6aaf Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/gui/book/bg_nightsky.png differ diff --git a/src/main/resources/assets/theurgy/textures/gui/book/bg_nightsky2.png b/src/main/resources/assets/theurgy/textures/gui/book/bg_nightsky2.png new file mode 100644 index 000000000..ecc779096 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/gui/book/bg_nightsky2.png differ diff --git a/src/main/resources/assets/theurgy/textures/gui/book/calcination_oven_working.png b/src/main/resources/assets/theurgy/textures/gui/book/calcination_oven_working.png new file mode 100644 index 000000000..cdca73781 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/gui/book/calcination_oven_working.png differ diff --git a/src/main/resources/assets/theurgy/textures/gui/book/distiller_working.png b/src/main/resources/assets/theurgy/textures/gui/book/distiller_working.png new file mode 100644 index 000000000..98aae01a0 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/gui/book/distiller_working.png differ diff --git a/src/main/resources/assets/theurgy/textures/gui/book/incubator_working.png b/src/main/resources/assets/theurgy/textures/gui/book/incubator_working.png new file mode 100644 index 000000000..329eea43e Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/gui/book/incubator_working.png differ diff --git a/src/main/resources/assets/theurgy/textures/gui/book/liquefaction_cauldron_working.png b/src/main/resources/assets/theurgy/textures/gui/book/liquefaction_cauldron_working.png new file mode 100644 index 000000000..16ba4f98e Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/gui/book/liquefaction_cauldron_working.png differ diff --git a/src/main/resources/assets/theurgy/textures/gui/jei/recipe_gui.png b/src/main/resources/assets/theurgy/textures/gui/jei/recipe_gui.png new file mode 100644 index 000000000..63a3fb8c6 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/gui/jei/recipe_gui.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/alchemical_salt.png b/src/main/resources/assets/theurgy/textures/item/alchemical_salt.png new file mode 100644 index 000000000..944383ee6 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/alchemical_salt.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_0.png b/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_0.png new file mode 100644 index 000000000..43afac934 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_0.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_1.png b/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_1.png new file mode 100644 index 000000000..1fd675de5 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_1.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_2.png b/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_2.png new file mode 100644 index 000000000..fe939f4f1 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_2.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_3.png b/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_3.png new file mode 100644 index 000000000..1ff88ef21 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_3.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_4.png b/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_4.png new file mode 100644 index 000000000..bf1186891 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_4.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_5.png b/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_5.png new file mode 100644 index 000000000..1731f10c3 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_5.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_6.png b/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_6.png new file mode 100644 index 000000000..8144fe46a Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_6.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_7.png b/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_7.png new file mode 100644 index 000000000..0bedab4e1 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_7.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_searching.png b/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_searching.png new file mode 100644 index 000000000..4caab0a3a Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_searching.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_searching.png.mcmeta b/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_searching.png.mcmeta new file mode 100644 index 000000000..375f3f096 --- /dev/null +++ b/src/main/resources/assets/theurgy/textures/item/amethyst_divination_rod/divination_rod_searching.png.mcmeta @@ -0,0 +1,23 @@ +{ + "animation": { + "frametime": 5, + "interpolate": true, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0 + ] + } +} diff --git a/src/main/resources/assets/theurgy/textures/item/mercury_crystal.png b/src/main/resources/assets/theurgy/textures/item/mercury_crystal.png new file mode 100644 index 000000000..1ca7bb168 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/mercury_crystal.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/mercury_shard.png b/src/main/resources/assets/theurgy/textures/item/mercury_shard.png new file mode 100644 index 000000000..117ac3d73 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/mercury_shard.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sal_ammoniac_crystal.png b/src/main/resources/assets/theurgy/textures/item/sal_ammoniac_crystal.png new file mode 100644 index 000000000..840be91f4 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sal_ammoniac_crystal.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_0.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_0.png new file mode 100644 index 000000000..43afac934 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_0.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_1.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_1.png new file mode 100644 index 000000000..1fd675de5 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_1.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_2.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_2.png new file mode 100644 index 000000000..fe939f4f1 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_2.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_3.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_3.png new file mode 100644 index 000000000..1ff88ef21 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_3.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_4.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_4.png new file mode 100644 index 000000000..bf1186891 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_4.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_5.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_5.png new file mode 100644 index 000000000..1731f10c3 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_5.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_6.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_6.png new file mode 100644 index 000000000..8144fe46a Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_6.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_7.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_7.png new file mode 100644 index 000000000..0bedab4e1 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_7.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_searching.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_searching.png new file mode 100644 index 000000000..4caab0a3a Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_searching.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_searching.png.mcmeta b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_searching.png.mcmeta new file mode 100644 index 000000000..375f3f096 --- /dev/null +++ b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_abundant/divination_rod_searching.png.mcmeta @@ -0,0 +1,23 @@ +{ + "animation": { + "frametime": 5, + "interpolate": true, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0 + ] + } +} diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_0.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_0.png new file mode 100644 index 000000000..43afac934 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_0.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_1.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_1.png new file mode 100644 index 000000000..1fd675de5 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_1.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_2.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_2.png new file mode 100644 index 000000000..fe939f4f1 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_2.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_3.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_3.png new file mode 100644 index 000000000..1ff88ef21 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_3.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_4.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_4.png new file mode 100644 index 000000000..bf1186891 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_4.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_5.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_5.png new file mode 100644 index 000000000..1731f10c3 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_5.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_6.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_6.png new file mode 100644 index 000000000..8144fe46a Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_6.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_7.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_7.png new file mode 100644 index 000000000..0bedab4e1 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_7.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_searching.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_searching.png new file mode 100644 index 000000000..4caab0a3a Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_searching.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_searching.png.mcmeta b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_searching.png.mcmeta new file mode 100644 index 000000000..375f3f096 --- /dev/null +++ b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_common/divination_rod_searching.png.mcmeta @@ -0,0 +1,23 @@ +{ + "animation": { + "frametime": 5, + "interpolate": true, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0 + ] + } +} diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_0.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_0.png new file mode 100644 index 000000000..43afac934 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_0.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_1.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_1.png new file mode 100644 index 000000000..1fd675de5 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_1.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_2.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_2.png new file mode 100644 index 000000000..fe939f4f1 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_2.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_3.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_3.png new file mode 100644 index 000000000..1ff88ef21 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_3.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_4.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_4.png new file mode 100644 index 000000000..bf1186891 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_4.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_5.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_5.png new file mode 100644 index 000000000..1731f10c3 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_5.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_6.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_6.png new file mode 100644 index 000000000..8144fe46a Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_6.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_7.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_7.png new file mode 100644 index 000000000..0bedab4e1 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_7.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_searching.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_searching.png new file mode 100644 index 000000000..4caab0a3a Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_searching.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_searching.png.mcmeta b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_searching.png.mcmeta new file mode 100644 index 000000000..375f3f096 --- /dev/null +++ b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_precious/divination_rod_searching.png.mcmeta @@ -0,0 +1,23 @@ +{ + "animation": { + "frametime": 5, + "interpolate": true, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0 + ] + } +} diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_0.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_0.png new file mode 100644 index 000000000..43afac934 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_0.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_1.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_1.png new file mode 100644 index 000000000..1fd675de5 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_1.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_2.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_2.png new file mode 100644 index 000000000..fe939f4f1 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_2.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_3.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_3.png new file mode 100644 index 000000000..1ff88ef21 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_3.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_4.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_4.png new file mode 100644 index 000000000..bf1186891 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_4.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_5.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_5.png new file mode 100644 index 000000000..1731f10c3 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_5.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_6.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_6.png new file mode 100644 index 000000000..8144fe46a Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_6.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_7.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_7.png new file mode 100644 index 000000000..0bedab4e1 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_7.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_searching.png b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_searching.png new file mode 100644 index 000000000..4caab0a3a Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_searching.png differ diff --git a/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_searching.png.mcmeta b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_searching.png.mcmeta new file mode 100644 index 000000000..375f3f096 --- /dev/null +++ b/src/main/resources/assets/theurgy/textures/item/sulfur_attuned_divination_rod_rare/divination_rod_searching.png.mcmeta @@ -0,0 +1,23 @@ +{ + "animation": { + "frametime": 5, + "interpolate": true, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 6, + 5, + 4, + 3, + 2, + 1, + 0 + ] + } +} diff --git a/src/main/resources/assets/theurgy/textures/particle/bubble.png b/src/main/resources/assets/theurgy/textures/particle/bubble.png new file mode 100644 index 000000000..2432913ab Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/particle/bubble.png differ diff --git a/src/main/resources/assets/theurgy/textures/particle/bubble_pop_0.png b/src/main/resources/assets/theurgy/textures/particle/bubble_pop_0.png new file mode 100644 index 000000000..42fcbda29 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/particle/bubble_pop_0.png differ diff --git a/src/main/resources/assets/theurgy/textures/particle/bubble_pop_1.png b/src/main/resources/assets/theurgy/textures/particle/bubble_pop_1.png new file mode 100644 index 000000000..2083c4e99 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/particle/bubble_pop_1.png differ diff --git a/src/main/resources/assets/theurgy/textures/particle/bubble_pop_2.png b/src/main/resources/assets/theurgy/textures/particle/bubble_pop_2.png new file mode 100644 index 000000000..de6e1ea87 Binary files /dev/null and b/src/main/resources/assets/theurgy/textures/particle/bubble_pop_2.png differ diff --git a/src/main/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t4_test.json b/src/main/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t4_test.json index cc3487eff..f6022e2ca 100644 --- a/src/main/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t4_test.json +++ b/src/main/resources/data/theurgy/recipes/crafting/shaped/divination_rod_t4_test.json @@ -9,24 +9,17 @@ }, "R": { "tag": "forge:rods/wooden" - }, - "S": { - "type": "forge:partial_nbt", - "item": "theurgy:alchemical_sulfur", - "nbt": { - "theurgy:sulfur.source.id": "minecraft:diamond" - } } }, "pattern": [ "RGR", - "RSR", + "RRR", " R " ], "result": { "item": "theurgy:divination_rod_t4", "nbt": { - "theurgy:divination.linked_block_id": "minecraft:diamond_ore", + "theurgy:divination.linked_block_id": "#forge:ores/diamond", "theurgy:divination.setting.tier": "minecraft:stone", "theurgy:divination.setting.allowed_blocks_tag": "theurgy:divination_rod_t4_allowed_blocks", "theurgy:divination.setting.disallowed_blocks_tag": "theurgy:divination_rod_t4_disallowed_blocks", diff --git a/src/main/resources/data/theurgy/tags/blocks/divination_rod_t1_disallowed_blocks.json b/src/main/resources/data/theurgy/tags/blocks/divination_rod_t1_disallowed_blocks.json deleted file mode 100644 index a22514f66..000000000 --- a/src/main/resources/data/theurgy/tags/blocks/divination_rod_t1_disallowed_blocks.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "replace": false, - "values": [ - ] -} \ No newline at end of file diff --git a/src/main/resources/data/theurgy/tags/blocks/divination_rod_t2_disallowed_blocks.json b/src/main/resources/data/theurgy/tags/blocks/divination_rod_t2_disallowed_blocks.json deleted file mode 100644 index a22514f66..000000000 --- a/src/main/resources/data/theurgy/tags/blocks/divination_rod_t2_disallowed_blocks.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "replace": false, - "values": [ - ] -} \ No newline at end of file diff --git a/src/main/resources/data/theurgy/tags/blocks/divination_rod_t3_disallowed_blocks.json b/src/main/resources/data/theurgy/tags/blocks/divination_rod_t3_disallowed_blocks.json deleted file mode 100644 index a22514f66..000000000 --- a/src/main/resources/data/theurgy/tags/blocks/divination_rod_t3_disallowed_blocks.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "replace": false, - "values": [ - ] -} \ No newline at end of file diff --git a/src/main/resources/data/theurgy/tags/blocks/divination_rod_t4_disallowed_blocks.json b/src/main/resources/data/theurgy/tags/blocks/divination_rod_t4_disallowed_blocks.json deleted file mode 100644 index a22514f66..000000000 --- a/src/main/resources/data/theurgy/tags/blocks/divination_rod_t4_disallowed_blocks.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "replace": false, - "values": [ - ] -} \ No newline at end of file