diff --git a/build.gradle b/build.gradle index 9a63aa1d..6a761c45 100644 --- a/build.gradle +++ b/build.gradle @@ -75,6 +75,16 @@ repositories { url = 'https://maven.blamejared.com/' content { includeGroup "mezz.jei" } } + maven { + name = 'Architectury API' + url = "https://maven.architectury.dev" + content { includeGroup "dev.architectury" } + } + maven { + name = 'KubeJS and Rhino' + url = "https://maven.saps.dev/minecraft" + content { includeGroup "dev.latvian.mods" } + } maven { name = 'ModKit' url 'https://jitpack.io' @@ -85,17 +95,21 @@ repositories { dependencies { minecraft("net.minecraftforge:forge:${mc_version}-${forge_version}") - // TOP - implementation(fg.deobf("mcjty.theoneprobe:theoneprobe:1.20.0-${top_version}") { + // TOP OPTIONAL + implementation(fg.deobf("mcjty.theoneprobe:theoneprobe:1.20.1-${top_version}") { transitive = false }) // JEI OPTIONAL compileOnly(fg.deobf("mezz.jei:jei-${mc_version}-common-api:${jei_version}")) compileOnly(fg.deobf("mezz.jei:jei-${mc_version}-forge-api:${jei_version}")) - // at runtime, use the full JEI jar for Forge runtimeOnly(fg.deobf("mezz.jei:jei-${mc_version}-forge:${jei_version}")) - // not required for players - implementation fg.deobf('com.github.thedarkcolour:ModKit:ea67392fd6') + // KubeJS OPTIONAL + //implementation fg.deobf("dev.latvian.mods:kubejs-forge:${kubejs_version}") + //implementation fg.deobf("dev.latvian.mods:rhino-forge:${rhino_version}") + //implementation fg.deobf("dev.architectury:architectury-forge:${architectury_version}") + + // ModKit DEV ONLY + implementation fg.deobf('com.github.thedarkcolour:ModKit:0aab5a727b') } def replaceProperties = [ mc_version: mc_version, mod_version: version ] diff --git a/gpl-3.0.txt b/gpl-3.0.txt new file mode 100644 index 00000000..f288702d --- /dev/null +++ b/gpl-3.0.txt @@ -0,0 +1,674 @@ + GNU 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. + + 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/gradle.properties b/gradle.properties index 3db35286..201c7e3f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,11 +5,15 @@ org.gradle.daemon=false org.gradle.cache=true mc_version=1.20.1 -forge_version=47.0.34 +forge_version=47.1.43 parchment_mappings=1.20.1-2023.06.26 geckolib_version=4.2 modonomicon_version=1.36.0 -jei_version=15.0.0.12 +jei_version=15.2.0.23 curios_version=5.2.0-beta.3 -top_version=9.0.0-1 \ No newline at end of file +top_version=10.0.1-3 + +kubejs_version=1902.6.1-build.349 +rhino_version=1902.2.2-build.269 +architectury_version=9.1.12 \ No newline at end of file diff --git a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d index 1f051af4..d474bd0c 100644 --- a/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d +++ b/src/generated/resources/.cache/59eb3dbb5f86130e09b3c62d89b9525ee01cf52d @@ -1,16 +1,42 @@ -// 1.20.1 2023-07-27T10:58:18.8937589 Loot Tables +// 1.20.1 2023-07-31T21:35:51.0164401 Loot Tables 326c04383bd2178850f0515fba6dc9c9bfce07cc data/exnihiloreborn/loot_tables/blocks/acacia_barrel.json +6cb2acba921254f40fde2dc401e8d3d4d17c6763 data/exnihiloreborn/loot_tables/blocks/acacia_crucible.json +46e54a49cc83124bed7676f3ea013428a0d14116 data/exnihiloreborn/loot_tables/blocks/acacia_sieve.json +46b9870a77e6f4996fde0605c5b4f67ec19cf289 data/exnihiloreborn/loot_tables/blocks/bamboo_barrel.json +c5265d5cc32c08c9818b54d04463f646e22e27f5 data/exnihiloreborn/loot_tables/blocks/bamboo_crucible.json +86a2d86896055e9ddf2fba482ddce1060ca44df0 data/exnihiloreborn/loot_tables/blocks/bamboo_sieve.json 7239ee3a1d8ca43b6ac84a308a4af5063241db24 data/exnihiloreborn/loot_tables/blocks/birch_barrel.json -55e7e691d4f48b13c4bbde87da7927e9bd983c3e data/exnihiloreborn/loot_tables/blocks/compressed_cobblestone.json -0e7be00762d28aa5a28f564f232a18170a861a8a data/exnihiloreborn/loot_tables/blocks/compressed_dirt.json -b5d0a1f20d7677abc42536c369b5702c67a676c1 data/exnihiloreborn/loot_tables/blocks/compressed_dust.json -350a3a81e4141b346808c77cfa4e8a5dbc3a5a2f data/exnihiloreborn/loot_tables/blocks/compressed_sand.json +a6a1f06aa0e46e1db326e2f7c760d810bcdf8736 data/exnihiloreborn/loot_tables/blocks/birch_crucible.json +efdb072ac0167cb84c2f4c99f0d751e2882a77d8 data/exnihiloreborn/loot_tables/blocks/birch_sieve.json +5b046dc403c76960518134a80abcd41e55817e0d data/exnihiloreborn/loot_tables/blocks/cherry_barrel.json +94de9d3f2c85597f72933d91916ab18e79bead9c data/exnihiloreborn/loot_tables/blocks/cherry_crucible.json +5b2c7686aa10bf68fc3e017b594392e2c48d1f72 data/exnihiloreborn/loot_tables/blocks/cherry_sieve.json c10ee8c3fe5e00ee3362596a2f5ed9349ca5d6c1 data/exnihiloreborn/loot_tables/blocks/crimson_barrel.json +a1357ed43b9f8f5d49f011b024a50ad10c29f4fb data/exnihiloreborn/loot_tables/blocks/crimson_crucible.json +b50559a54e3229686397cf2eb8bf631564a31c0c data/exnihiloreborn/loot_tables/blocks/crimson_sieve.json +d19ed769a379e164276a40db99e57245a51b7a79 data/exnihiloreborn/loot_tables/blocks/crushed_end_stone.json +89afb6804eba5e6eb815491166f9b96bd6753765 data/exnihiloreborn/loot_tables/blocks/crushed_netherrack.json 05efa87a7fb08d988544756d596ebe53dd0584c8 data/exnihiloreborn/loot_tables/blocks/dark_oak_barrel.json +152369c6ecb44f7b35e73e271b72fd1a18aacb34 data/exnihiloreborn/loot_tables/blocks/dark_oak_crucible.json +b8ea657d0f5ced81be30958de78bdf7157084451 data/exnihiloreborn/loot_tables/blocks/dark_oak_sieve.json 9354ad853e29c5a051f3319b66c19b0649be43a1 data/exnihiloreborn/loot_tables/blocks/dust.json eebb19a95fba75bb9abaaad7a7cd731f06351d9b data/exnihiloreborn/loot_tables/blocks/infested_leaves.json da7317e6905aee49b47b9cf98d89d6a38379a34e data/exnihiloreborn/loot_tables/blocks/jungle_barrel.json +2039b4bfd346f7fb4ddde00e93917711e51fab83 data/exnihiloreborn/loot_tables/blocks/jungle_crucible.json +8a49d7530a5b76825066c14c0acc153d8c06ee10 data/exnihiloreborn/loot_tables/blocks/jungle_sieve.json +bec066e549155dfab4b9d8b10969f68ff856f86d data/exnihiloreborn/loot_tables/blocks/mangrove_barrel.json +8a90519c2f66d42f180815c4541e99fdf231fa3e data/exnihiloreborn/loot_tables/blocks/mangrove_crucible.json +93c22058463f1eaf67377b15364353a10c33219e data/exnihiloreborn/loot_tables/blocks/mangrove_sieve.json bd38cae64c70238e95529bd16f512f1a2ef2f69f data/exnihiloreborn/loot_tables/blocks/oak_barrel.json +9c0d3237a137466dd9932c9ed0674091232b4c4c data/exnihiloreborn/loot_tables/blocks/oak_crucible.json +53bc915538b94ca3e283fac0e4ea05b568afef19 data/exnihiloreborn/loot_tables/blocks/oak_sieve.json +ba39872b9abcdd6a802384b767128791619d3071 data/exnihiloreborn/loot_tables/blocks/porcelain_crucible.json 93a2689c6f6fb689910982ddc9ac927c7432bfe2 data/exnihiloreborn/loot_tables/blocks/spruce_barrel.json +20d4057ea0052a6a655970741277f25ce838778b data/exnihiloreborn/loot_tables/blocks/spruce_crucible.json +886511787a83f7d4fe61d3d6428c9899d823f8c2 data/exnihiloreborn/loot_tables/blocks/spruce_sieve.json 5ab70649c89c6ab9d14fdd95e053d591d8941076 data/exnihiloreborn/loot_tables/blocks/stone_barrel.json +8d754d5573180a44ef28d81dfd37c2b5c0540ded data/exnihiloreborn/loot_tables/blocks/unfired_crucible.json 611f523b7a6b5b323e07d5e8a76620858559e8b8 data/exnihiloreborn/loot_tables/blocks/warped_barrel.json +8eb07e6ebd117eaebab367376b4f4249d77ca4ef data/exnihiloreborn/loot_tables/blocks/warped_crucible.json +ebbeed42b18550f359595bf922f74aba6aa60d32 data/exnihiloreborn/loot_tables/blocks/warped_sieve.json +9368ef21629743383c2f8f20580c3724cbb15e61 data/exnihiloreborn/loot_tables/blocks/witch_water.json diff --git a/src/generated/resources/.cache/5f5ddf0caee48d851cd5055dbc7b23dfdcd4b8a5 b/src/generated/resources/.cache/5f5ddf0caee48d851cd5055dbc7b23dfdcd4b8a5 index 0952b63d..be074251 100644 --- a/src/generated/resources/.cache/5f5ddf0caee48d851cd5055dbc7b23dfdcd4b8a5 +++ b/src/generated/resources/.cache/5f5ddf0caee48d851cd5055dbc7b23dfdcd4b8a5 @@ -1,2 +1,2 @@ -// 1.20.1 2023-07-27T12:51:19.3141363 ModKit Language: en_us for mod 'exnihiloreborn' -7883d6bd9bf13e07fe9b9dca3a2b85891c0a34fb assets/exnihiloreborn/lang/en_us.json +// 1.20.1 2023-08-03T17:20:09.1082545 ModKit Language: en_us for mod 'exnihiloreborn' +40c18b2dfd4feb7f50301c175737606df110b746 assets/exnihiloreborn/lang/en_us.json diff --git a/src/generated/resources/.cache/86e8fad2261d20af97e8edef657773f7c7b2823e b/src/generated/resources/.cache/86e8fad2261d20af97e8edef657773f7c7b2823e index 9e91412d..9a7a8f9a 100644 --- a/src/generated/resources/.cache/86e8fad2261d20af97e8edef657773f7c7b2823e +++ b/src/generated/resources/.cache/86e8fad2261d20af97e8edef657773f7c7b2823e @@ -1 +1,3 @@ -// 1.20.1 2023-07-24T13:27:44.3296716 Tags for minecraft:block mod id exnihiloreborn +// 1.20.1 2023-07-31T21:25:34.8783191 Tags for minecraft:block mod id exnihiloreborn +723f7e0bbd67dd36d5792d6579191914b86bae39 data/minecraft/tags/blocks/mineable/axe.json +44b29639f893e2ce6c13400a7d594d7426b05ded data/minecraft/tags/blocks/mineable/pickaxe.json diff --git a/src/generated/resources/.cache/88728e8b0aba78bc481ee96e4ac0a48656a2d2b8 b/src/generated/resources/.cache/88728e8b0aba78bc481ee96e4ac0a48656a2d2b8 index e2c86408..60755322 100644 --- a/src/generated/resources/.cache/88728e8b0aba78bc481ee96e4ac0a48656a2d2b8 +++ b/src/generated/resources/.cache/88728e8b0aba78bc481ee96e4ac0a48656a2d2b8 @@ -1,7 +1,8 @@ -// 1.20.1 2023-07-27T11:42:20.2188641 ModKit Item Models for mod 'exnihiloreborn' +// 1.20.1 2023-08-03T17:20:09.109254 ModKit Item Models for mod 'exnihiloreborn' b04ca14f505feb0c3145a0ec24e482f569fa1f8b assets/exnihiloreborn/models/item/acacia_barrel.json a3c0b9510b70d74c0c5430d782d9582378143599 assets/exnihiloreborn/models/item/acacia_crucible.json 535cff3f576461aebe434a1ec8f9711776898e5f assets/exnihiloreborn/models/item/acacia_sieve.json +4e80010d91a1d6afd3a590bef246b592e9ded9b9 assets/exnihiloreborn/models/item/andesite_pebble.json a88334b623bd893eeb3068d6fb41879258a71043 assets/exnihiloreborn/models/item/bamboo_barrel.json 77e1e0a00a28bf81a6453ccd79ec2298bad6456d assets/exnihiloreborn/models/item/bamboo_crucible.json 96a8ac56018b941030e3723fd6c668d5e6f077b7 assets/exnihiloreborn/models/item/bamboo_sieve.json @@ -13,7 +14,7 @@ d634e2fbb0b1149fcbbebbc45e619b4670f6703a assets/exnihiloreborn/models/item/birch 857e1c605e0c00e54ff9815933cf62399e360cac assets/exnihiloreborn/models/item/cherry_crucible.json 203704e4f975d9fb6a5883e47dc986d3f7ff05f6 assets/exnihiloreborn/models/item/cherry_sieve.json 24a5c572fd594b8e5acce55cf529be866f4e886a assets/exnihiloreborn/models/item/cooked_silk_worm.json -039a1c59b83319648aba5daa1af2af2c9e73a505 assets/exnihiloreborn/models/item/copper_ore_pieces.json +ae8ff39148346b364f4104316e9a0762f8ebc63b assets/exnihiloreborn/models/item/copper_ore_chunk.json 80502debe44d9fcb8c01b307939d32c47d6b87f1 assets/exnihiloreborn/models/item/crimson_barrel.json ea89af27e1fe1cb2303b38d79159e8902f97f4a3 assets/exnihiloreborn/models/item/crimson_crucible.json 7af13e06a0c7cb8341b654a6f8ae4dc6f1192a43 assets/exnihiloreborn/models/item/crimson_sieve.json @@ -26,13 +27,16 @@ ea89af27e1fe1cb2303b38d79159e8902f97f4a3 assets/exnihiloreborn/models/item/crims eeb577a82f53d7402e319e885940c22dab7fc013 assets/exnihiloreborn/models/item/deepslate_pebble.json 1d9e7750ac92f1a7fb9eefefeabd88b007a418c9 assets/exnihiloreborn/models/item/diamond_hammer.json 6bfbf0110e79fc4a3d23f19c717b30fc0b802142 assets/exnihiloreborn/models/item/diamond_mesh.json +11e2b9f314b00c78a7b8f2727975ef686d515b59 assets/exnihiloreborn/models/item/diorite_pebble.json 4c3b1319ea57598dad8c71f9aaa5676d2c37df57 assets/exnihiloreborn/models/item/dust.json 0c3725d74213d85a332226d2a2472a5c4a0f66cd assets/exnihiloreborn/models/item/flint_mesh.json 76282a4cd8b8f6aa0c5d72677be3173827eb3ff6 assets/exnihiloreborn/models/item/golden_hammer.json -22c8f2d53b0473d9df577536b5f0270ae63bf5bd assets/exnihiloreborn/models/item/gold_ore_pieces.json +92a10f91557166dad46417e6a2b107d3e4aca206 assets/exnihiloreborn/models/item/golden_mesh.json +df2918f82a8ccdcfc8e2e39a01a8d9dbd187f537 assets/exnihiloreborn/models/item/gold_ore_chunk.json +286f56e322262c2336950c87dc493f35a3f1794b assets/exnihiloreborn/models/item/granite_pebble.json 30f28bafa588f7c036744d4507718734d4c781e7 assets/exnihiloreborn/models/item/iron_hammer.json de8a49ab10ece0aab2442e774dde8dc183783401 assets/exnihiloreborn/models/item/iron_mesh.json -565691b30362d5c4587b9c7a4b3245f2f1023147 assets/exnihiloreborn/models/item/iron_ore_pieces.json +78f75aeb34fef71e0d73a2fb3981e3e8b3a09f44 assets/exnihiloreborn/models/item/iron_ore_chunk.json 318d5f172fdb062a59953353de55d56ed9d76642 assets/exnihiloreborn/models/item/jungle_barrel.json a4f6b856970f9f039deb71f07e02764be185a366 assets/exnihiloreborn/models/item/jungle_crucible.json e449e5fab8da5d332373caa04929b901f83aeb78 assets/exnihiloreborn/models/item/jungle_sieve.json @@ -55,6 +59,7 @@ ca863a6c57b74743105f20bd9e84bddde78b754b assets/exnihiloreborn/models/item/spruc 66b6eaeeb75466603a8aa9438b11fc73e5c77f2f assets/exnihiloreborn/models/item/stone_hammer.json 44481e3cbb4765019d9cde572a18e17d0b878f24 assets/exnihiloreborn/models/item/stone_pebble.json 1eba49433a0cb08b803369899e10795c949bc45a assets/exnihiloreborn/models/item/string_mesh.json +c92fdc69afd163a6f4c8b3a0fe473da3b098d426 assets/exnihiloreborn/models/item/tuff_pebble.json 786bc050fc466f27c3ae77524c36ebfa1c3de611 assets/exnihiloreborn/models/item/unfired_crucible.json e8a646e41fbdf8748b28bdee70d2e5674fab35f4 assets/exnihiloreborn/models/item/warped_barrel.json 1510e5ebe284711da4a8b83ee4e5d17daa75d7ca assets/exnihiloreborn/models/item/warped_crucible.json diff --git a/src/generated/resources/.cache/9e63038493dc91d16be52c0edde554af2820040f b/src/generated/resources/.cache/9e63038493dc91d16be52c0edde554af2820040f new file mode 100644 index 00000000..25d78fa3 --- /dev/null +++ b/src/generated/resources/.cache/9e63038493dc91d16be52c0edde554af2820040f @@ -0,0 +1,2 @@ +// 1.20.1 2023-08-02T19:12:05.2741196 Tags for minecraft:fluid mod id exnihiloreborn +2eeaca82c985b533806e320dd8df746fb3d38a65 data/minecraft/tags/fluids/water.json diff --git a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e index fe1b3f64..4390af84 100644 --- a/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e +++ b/src/generated/resources/.cache/9fb1092f32d4fcbf9e061ffd718d4ec689c6c95e @@ -1,19 +1,26 @@ -// 1.20.1 2023-07-27T12:51:19.3161371 Recipes +// 1.20.1 2023-08-03T17:55:15.053135 Recipes a3e58be04205964a0b890880f040d2fc0b9249e0 data/exnihiloreborn/advancements/recipes/food/cooked_silk_worm.json e370135e6c1584c360ab7f5595d363f66b6665cb data/exnihiloreborn/advancements/recipes/food/cooked_silk_worm_from_smoking.json a997345e74cecf81d4ae9c38973630ce6edf00f5 data/exnihiloreborn/advancements/recipes/food/porcelain_crucible_from_campfire_cooking.json 54db00472cd9b30762b21263d721e91fae5c2858 data/exnihiloreborn/advancements/recipes/misc/acacia_barrel.json 90a26e2be958eb40c751a78360e606a681979075 data/exnihiloreborn/advancements/recipes/misc/acacia_crucible.json +0f8059dc21077fcf21639074de161778d36ca122 data/exnihiloreborn/advancements/recipes/misc/andesite.json 460f1827f3870a74868c2fdc3109d21c848cd911 data/exnihiloreborn/advancements/recipes/misc/bamboo_barrel.json 81f0df6bd5f0291aeb1dc54ef6f3c600bcd57ad2 data/exnihiloreborn/advancements/recipes/misc/bamboo_crucible.json 9573f025a3fdd8b8c2fd10c80d71972cd3133a66 data/exnihiloreborn/advancements/recipes/misc/birch_barrel.json 61c0510138b5dc14f623c02e5cd99202e7292450 data/exnihiloreborn/advancements/recipes/misc/birch_crucible.json 528bb21007cc050a964654f8a437bc7bb4966e3b data/exnihiloreborn/advancements/recipes/misc/cherry_barrel.json 925e20e41534e50ba00ebfa5aaa0f3f171998a00 data/exnihiloreborn/advancements/recipes/misc/cherry_crucible.json +c9091169b9382c14662b145efb356e0736cc9c3a data/exnihiloreborn/advancements/recipes/misc/cobblestone.json +66516d099bcfeaecf4e9cf124a6fc32d23e62c9f data/exnihiloreborn/advancements/recipes/misc/copper_ore.json fd717e6474c96f26c2d72641cb67c19ecf4026b1 data/exnihiloreborn/advancements/recipes/misc/crimson_barrel.json 6a23ae2d2c46c827d0b7934410ac0e82fb3292e1 data/exnihiloreborn/advancements/recipes/misc/crimson_crucible.json 93b9339aae694eb850981382b7e0a84171185448 data/exnihiloreborn/advancements/recipes/misc/dark_oak_barrel.json 0267d7b9f193d7fb328920b17ea2fa09425d8594 data/exnihiloreborn/advancements/recipes/misc/dark_oak_crucible.json +3060de107a0b730f32b4cdd964f33b8f7808922a data/exnihiloreborn/advancements/recipes/misc/diorite.json +301aa831ade913d56fe3bc4c62dd0c8225362db9 data/exnihiloreborn/advancements/recipes/misc/gold_ore.json +dfe0d24255b0f96e6d51485aa0f47fe2c5ad7699 data/exnihiloreborn/advancements/recipes/misc/granite.json +78487b1c36b9ac063ab0014c7f5bae37d5239799 data/exnihiloreborn/advancements/recipes/misc/iron_ore.json 37af38214d27787d743b0005e8feca0e0f100cea data/exnihiloreborn/advancements/recipes/misc/jungle_barrel.json 5360db4c3c1e92b4f158b6d8560d1d83ea164b9e data/exnihiloreborn/advancements/recipes/misc/jungle_crucible.json fd9afece033aea82e8a3ee12d8ed45ca2ebf622d data/exnihiloreborn/advancements/recipes/misc/mangrove_barrel.json @@ -24,6 +31,7 @@ fd9afece033aea82e8a3ee12d8ed45ca2ebf622d data/exnihiloreborn/advancements/recipe 92dedd042dac942b381704d4ea3c1f5d9e235fd9 data/exnihiloreborn/advancements/recipes/misc/spruce_barrel.json 7febca27399bf00babc090143c96b5eca4d76a4b data/exnihiloreborn/advancements/recipes/misc/spruce_crucible.json cf0dba5dc3969ab76d3175b7a3df332d54952526 data/exnihiloreborn/advancements/recipes/misc/stone_barrel.json +b27c1f5cd97c5bd0cf00cdb9e5c04d8c4726fbb9 data/exnihiloreborn/advancements/recipes/misc/string_mesh.json fc59e8cfe5a982f669dd9a44bc2156b88a5ad559 data/exnihiloreborn/advancements/recipes/misc/unfired_crucible.json f3f469f966cfc8c2e43cc9d49dd13f9085d48ec7 data/exnihiloreborn/advancements/recipes/misc/warped_barrel.json 8c329ca51865a225bb50dfe7642a33e91a2db68f data/exnihiloreborn/advancements/recipes/misc/warped_crucible.json @@ -37,6 +45,7 @@ f1e5c3dcb58a67f20182260f90ab8345839bfa3a data/exnihiloreborn/advancements/recipe c37bc0b1ac02ea202c2607d9b56d10e2adf8db1b data/exnihiloreborn/advancements/recipes/tools/wooden_hammer.json 15ab7f3a8fb33766ffcd0c479baad03464c84072 data/exnihiloreborn/recipes/acacia_barrel.json 1d052e4d187e6031475d152096231eb0b75b17e3 data/exnihiloreborn/recipes/acacia_crucible.json +eac1636f1be17e497bfc5f41451360e450d58c8b data/exnihiloreborn/recipes/andesite.json 7a75cd85dd46fd082f0b9c10bc97dda93b00ea46 data/exnihiloreborn/recipes/bamboo_barrel.json 687a62eda344b5adace2469dab89d6da30006417 data/exnihiloreborn/recipes/bamboo_crucible.json 0dace1f83ca8735522f33f5efc40bf3e7e247ebb data/exnihiloreborn/recipes/barrel_compost/apple.json @@ -79,29 +88,42 @@ a2890194aed3620c2a096d66853f7dfff134f33b data/exnihiloreborn/recipes/barrel_comp 1a93f6756bfabc23bc186fb8b2bfbbc48781b5ca data/exnihiloreborn/recipes/barrel_compost/tropical_fish.json 30617af84eef24a61805cef9f12f7df1819a2c28 data/exnihiloreborn/recipes/barrel_compost/vine.json a1efb6dfadde94b73da785f3d9857eed2540c1f7 data/exnihiloreborn/recipes/barrel_compost/wheat.json +3ed1a1c0ddbd858c5cdb9934601ea7a06d83d516 data/exnihiloreborn/recipes/barrel_mixing/end_stone.json +b1abd39ac9a5d9d04a5870c7d753fc167bfa06e9 data/exnihiloreborn/recipes/barrel_mixing/ice.json +ff6204014e3bc860e4a9ef3746a7ed817ba9ec12 data/exnihiloreborn/recipes/barrel_mixing/netherrack.json +07e3d165c60296150f087f71276ac9be401f5bbe data/exnihiloreborn/recipes/barrel_mixing/obsidian.json +2b3b95049085360930bc0c37a55a69e718ea9ae9 data/exnihiloreborn/recipes/barrel_mixing/slime_block.json +10cb7f258ecb82fddc04710f611cad72b08b07f7 data/exnihiloreborn/recipes/barrel_mixing/soul_sand.json +840208a4bbb44595783ee353513cbda548413b36 data/exnihiloreborn/recipes/barrel_mixing/stone.json 6e3df85650328bce42f118edb970947c33d21f87 data/exnihiloreborn/recipes/birch_barrel.json b33e570733c5188df4e4fa23333688bbb41fd628 data/exnihiloreborn/recipes/birch_crucible.json a77177a80976dadad475d076045ed0fe35ab728f data/exnihiloreborn/recipes/bone_crook.json 2262902695810de5890ea8eb49b1641007d46e53 data/exnihiloreborn/recipes/cherry_barrel.json 22abc7bc31f67b4e2242dc6686281a9b5c977713 data/exnihiloreborn/recipes/cherry_crucible.json +c0f93396b9e7506018a5c7e55708b6e016b752d2 data/exnihiloreborn/recipes/cobblestone.json de36f05633916a8fab54b6b7814165314a7c41c4 data/exnihiloreborn/recipes/cooked_silk_worm.json 809138aa3568b0b805306ec5134f62a260437831 data/exnihiloreborn/recipes/cooked_silk_worm_from_smoking.json +bfa7fb09202a264f6e65f331831f03b3a4eb6a0a data/exnihiloreborn/recipes/copper_ore.json ca5f097f3c474a582c54bd370897dea18a10daaa data/exnihiloreborn/recipes/crimson_barrel.json 6c6283ce04a0599f4e85f247e0e397f8ba5df8ee data/exnihiloreborn/recipes/crimson_crucible.json ca5e9fd7400f3e44658911436d7e9e4da1095015 data/exnihiloreborn/recipes/crook.json 5bb2a9d487ebc80970caf29ecd3e528df01bbac4 data/exnihiloreborn/recipes/dark_oak_barrel.json 7eade02376b91508a564c06eed144104a0215869 data/exnihiloreborn/recipes/dark_oak_crucible.json 7a58ae52499005a8b194e406f31c1be4a223f483 data/exnihiloreborn/recipes/diamond_hammer.json +1409ef29665177b2be9a57a38e9682af9c15cbee data/exnihiloreborn/recipes/diorite.json 13540d2f5bb66b2bd194dca5ad8175f36c3625ca data/exnihiloreborn/recipes/golden_hammer.json -da98669d2e0d8a2b037498f63fdd534c4ad7f88c data/exnihiloreborn/recipes/hammer/crushed_netherrack.json -041032a45125fd9f8915a928ec7524c276bea4a8 data/exnihiloreborn/recipes/hammer/crushing_red_sandstone.json -968a3c7e89ec7c793bef9448eee61eb41c1e6292 data/exnihiloreborn/recipes/hammer/crushing_sandstone.json -4fae674b4893d89c06ab7cea1374e3cb6beb8bdc data/exnihiloreborn/recipes/hammer/crushing_stone_bricks.json -421e577d31ea9f29c94fc4accf2228cc82203fd1 data/exnihiloreborn/recipes/hammer/dust.json -24d6e7ad05b49201dd0fbc7d947ee1c7eaa536c6 data/exnihiloreborn/recipes/hammer/gravel.json -89e95a16b00d0fed6ded49c75573cd31dc636565 data/exnihiloreborn/recipes/hammer/sand.json -cc0996112cbb3bea9edb1e130044df4db2b11c75 data/exnihiloreborn/recipes/hammer/stone_pebbles.json +da2bf88f10b6fe054b6a13367cef6a36d420a6e1 data/exnihiloreborn/recipes/gold_ore.json +4b1fbb11dd0acd219bc4ea9eb148685bce52e60e data/exnihiloreborn/recipes/granite.json +1db6202ef25021d3c9a823904e1a3f91fada4c6f data/exnihiloreborn/recipes/hammer/crushed_netherrack.json +f82f21f9c6628e363811e3f2721615b6cc12a908 data/exnihiloreborn/recipes/hammer/crushing_red_sandstone.json +55a047c193301bf84514f339fab861e8c330ab7d data/exnihiloreborn/recipes/hammer/crushing_sandstone.json +40bab0961e8b0d0dfd42cde84839784e6081fdab data/exnihiloreborn/recipes/hammer/crushing_stone_bricks.json +375e55a9dcbba1f4c018ea4f8fe5668a269204f5 data/exnihiloreborn/recipes/hammer/dust.json +3a8af83e7901805ea9c6eff82471f2c990703db7 data/exnihiloreborn/recipes/hammer/gravel.json +3187bc4ba54086e69db19f265a17f3e3063a9256 data/exnihiloreborn/recipes/hammer/sand.json +4996ce338f802fa9d60f6d4f1884940ebefc233e data/exnihiloreborn/recipes/hammer/stone_pebbles.json f52d66bd356d8a087380bcba6d2ace5aefd20634 data/exnihiloreborn/recipes/iron_hammer.json +320efefe394abc12d15f4095c961746b5a79df84 data/exnihiloreborn/recipes/iron_ore.json f1c9f600738b54452c064fb87bfc2a7cd426fff8 data/exnihiloreborn/recipes/jungle_barrel.json 862ce48ca979cfe274b1c3ccb13d4b5a51ca9864 data/exnihiloreborn/recipes/jungle_crucible.json 4619cf9593d9c2703d4422614bce3e562ae91d76 data/exnihiloreborn/recipes/lava_crucible/cobblestone.json @@ -115,15 +137,26 @@ e74887ddb09e78aee413ec63aaa25a9ab0f0ebbf data/exnihiloreborn/recipes/mangrove_cr a0501465b356002e17328ff509eecfa93e952a08 data/exnihiloreborn/recipes/oak_crucible.json 6c9f7a6da776a73b0daf13e431c7d5ac73a58bed data/exnihiloreborn/recipes/porcelain_crucible.json 19a026d0e8c0614cbc2b11150da49688ac0d3b0c data/exnihiloreborn/recipes/porcelain_crucible_from_campfire_cooking.json -884041f9ea725ca44ac80e9e111e63099c82f8df data/exnihiloreborn/recipes/sieve/beetroot_seeds.json -a8aef540a3d6b2b4ba30fc9813bd3e5df1d50ce6 data/exnihiloreborn/recipes/sieve/melon_seeds.json -de43f772121c76d9b86d38673be84816a067d7c1 data/exnihiloreborn/recipes/sieve/pumpkin_seeds.json -f0afd639fc9238f4f23bd6f5a2066cf16101d39a data/exnihiloreborn/recipes/sieve/stone_pebble.json -5dfd628e764284176dbfc024c1abdd753148845e data/exnihiloreborn/recipes/sieve/wheat_seeds.json +caa0a248c8f6d397970de66bf28b202ce3557d05 data/exnihiloreborn/recipes/sieve/flint/andesite_pebble.json +a291f0815afe152b2d68865704699448f8b74fe9 data/exnihiloreborn/recipes/sieve/flint/beetroot_seeds.json +94560929016b1ababa51875aec11a73838b44816 data/exnihiloreborn/recipes/sieve/flint/diorite_pebble.json +007204a8c4ba383ae6099b63cdd556376d9efe82 data/exnihiloreborn/recipes/sieve/flint/flint.json +e3342d4dce65cec82e7b3beb5c4282d705ea4be0 data/exnihiloreborn/recipes/sieve/flint/granite_pebble.json +445bf2ddad6e9a9a8f7e4e8835e72d0b8d9aefc0 data/exnihiloreborn/recipes/sieve/flint/melon_seeds.json +b5128a31a9a613a8c0e5c96d137d4c98e80fab94 data/exnihiloreborn/recipes/sieve/flint/pumpkin_seeds.json +ff4f4cddb407223d1b56bb3dc334cb44a4b3d9ed data/exnihiloreborn/recipes/sieve/flint/stone_pebble.json +2167f7f6ef63ce1f36b5530f834b01e3929dd594 data/exnihiloreborn/recipes/sieve/flint/wheat_seeds.json +2e71936f4a2a2c251dd887070f911db955a6d5db data/exnihiloreborn/recipes/sieve/string/beetroot_seeds.json +53b6f54cc3e0c84faab81a1860e4ce9f9991325e data/exnihiloreborn/recipes/sieve/string/flint.json +94dd692b0b73bc92d6158d0b4d4bca8176f261eb data/exnihiloreborn/recipes/sieve/string/melon_seeds.json +64b2cffef78659cef8862cbfcf57ff5644d7feea data/exnihiloreborn/recipes/sieve/string/pumpkin_seeds.json +85d4af1b464b4a1dbfbea34b34c0a0901f1cf2b7 data/exnihiloreborn/recipes/sieve/string/stone_pebble.json +08bdc228a11b8273ffc81a07325026390292dd7c data/exnihiloreborn/recipes/sieve/string/wheat_seeds.json ffb29840856a0e5feb21c6992bfccbd6cb177882 data/exnihiloreborn/recipes/spruce_barrel.json 4cadea3ddd3378b8eb3654f537b2355be053471b data/exnihiloreborn/recipes/spruce_crucible.json 1a1187987414031f287bf60ac07e2058f3795bd0 data/exnihiloreborn/recipes/stone_barrel.json bdf1b94117a393d54bd291a41ab9d1f5d7828db0 data/exnihiloreborn/recipes/stone_hammer.json +fc23351592c713c3d50f79d1a71b5110a1a36ea5 data/exnihiloreborn/recipes/string_mesh.json 8d8ef9f564035f52f3e4bc5ad04ba760721b43d6 data/exnihiloreborn/recipes/unfired_crucible.json 4fa9d5d6e61a8e318e861e76067d2f7b857d5d26 data/exnihiloreborn/recipes/warped_barrel.json 8f6e9c019bb9761a97a2287539e28dd4417261e2 data/exnihiloreborn/recipes/warped_crucible.json diff --git a/src/generated/resources/.cache/adcb492c336614f4dabbf7b0ba1b80a1feec2905 b/src/generated/resources/.cache/adcb492c336614f4dabbf7b0ba1b80a1feec2905 index bf36d943..5425259c 100644 --- a/src/generated/resources/.cache/adcb492c336614f4dabbf7b0ba1b80a1feec2905 +++ b/src/generated/resources/.cache/adcb492c336614f4dabbf7b0ba1b80a1feec2905 @@ -1,6 +1,8 @@ -// 1.20.1 2023-07-27T10:58:18.8907585 Tags for minecraft:item mod id exnihiloreborn +// 1.20.1 2023-08-03T17:20:09.1072536 Tags for minecraft:item mod id exnihiloreborn 3602c357ad3f65545614e0829504c3bd0e3b9925 data/exnihiloreborn/tags/items/barrels.json d5441416296951ce5fd5ce14bc6d3753b4f26950 data/exnihiloreborn/tags/items/crooks.json b08e46cd1efe72662e1fab1b90fe65ba31695695 data/exnihiloreborn/tags/items/hammers.json +4339c19de1b03c49492cb85d282195db571c1148 data/exnihiloreborn/tags/items/pebbles.json +21515ccfd7e68fc84be41b5a31420c76640c0ccd data/exnihiloreborn/tags/items/sieve_meshes.json 4d0a7706e14b16cfe3c6f98c535afc582d714578 data/exnihiloreborn/tags/items/stone_barrels.json b24f3ab9d607e3257d78d3a754a1255507e245f8 data/exnihiloreborn/tags/items/wooden_barrels.json diff --git a/src/generated/resources/.cache/d2a52f93f6a2dbbf9cb17e741383b71a5107d737 b/src/generated/resources/.cache/d2a52f93f6a2dbbf9cb17e741383b71a5107d737 index 025dc671..61b26bba 100644 --- a/src/generated/resources/.cache/d2a52f93f6a2dbbf9cb17e741383b71a5107d737 +++ b/src/generated/resources/.cache/d2a52f93f6a2dbbf9cb17e741383b71a5107d737 @@ -1,4 +1,4 @@ -// 1.20.1 2023-07-25T16:40:21.4007052 Tags for minecraft:worldgen/structure_set mod id exnihiloreborn +// 1.20.1 2023-07-31T10:44:07.5040349 Tags for minecraft:worldgen/structure_set mod id exnihiloreborn 35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/exnihiloreborn/tags/worldgen/structure_set/overworld_void_structure_sets.json -35133e95f1c8fdd7a1c21afcc231fc0bffefb9a8 data/exnihiloreborn/tags/worldgen/structure_set/the_end_void_structure_sets.json +56ffeb3beb8ca3df4a20420bc56f6139ebf57ada data/exnihiloreborn/tags/worldgen/structure_set/the_end_void_structure_sets.json 14abefb27112e5ad3ebce0cb9618fb51c54e2f9d data/exnihiloreborn/tags/worldgen/structure_set/the_nether_void_structure_sets.json diff --git a/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 b/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 index 10e6a87d..583fb227 100644 --- a/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 +++ b/src/generated/resources/.cache/e5c5eb35b4ba40351ecb7d9f04c3527f2f5779b0 @@ -1,6 +1,6 @@ -// 1.20.1 2023-07-25T23:58:50.2136539 Advancements +// 1.20.1 2023-07-31T10:44:07.5060349 Advancements 82b18f9cd2e795822f726a2228b8afbe0725ec92 data/exnihiloreborn/advancements/core/barrel.json -a9e9465ae18de97071060c1e9bda17bf47951524 data/exnihiloreborn/advancements/core/crook.json +f8000323ce5754fad2f610f9dd9ad4e8028d3bcf data/exnihiloreborn/advancements/core/crook.json 59a21529ea42ad657750110399ff1cabfead380f data/exnihiloreborn/advancements/core/root.json 7103c0d7631de60d10e77f1a87a3232a30005c26 data/exnihiloreborn/advancements/core/silk_worm.json 6a9f99474e987b4c6f9031f20a77508c00280217 data/exnihiloreborn/advancements/core/string_mesh.json diff --git a/src/generated/resources/assets/exnihiloreborn/lang/en_us.json b/src/generated/resources/assets/exnihiloreborn/lang/en_us.json index bc3040a8..e14a13f3 100644 --- a/src/generated/resources/assets/exnihiloreborn/lang/en_us.json +++ b/src/generated/resources/assets/exnihiloreborn/lang/en_us.json @@ -2,7 +2,7 @@ "advancements.exnihiloreborn.core.barrel.description": "Use a barrel to compost organic material into dirt", "advancements.exnihiloreborn.core.barrel.title": "That Goes in the GreenWaste", "advancements.exnihiloreborn.core.crook.description": "Craft a Crook to double sapling drops from leaves", - "advancements.exnihiloreborn.core.crook.title": "This is a Robbery", + "advancements.exnihiloreborn.core.crook.title": "Give Him The Hook", "advancements.exnihiloreborn.core.root.description": "Spawn into a SkyBlock void world", "advancements.exnihiloreborn.core.root.title": "Don't Look Down...", "advancements.exnihiloreborn.core.silk_worm.description": "Obtain a silk worm, then infest a tree with it to get string", @@ -21,12 +21,6 @@ "block.exnihiloreborn.cherry_barrel": "Cherry Barrel", "block.exnihiloreborn.cherry_crucible": "Cherry Crucible", "block.exnihiloreborn.cherry_sieve": "Cherry Sieve", - "block.exnihiloreborn.compressed_cobblestone": "Compressed Cobblestone", - "block.exnihiloreborn.compressed_crushed_end_stone": "Compressed Crushed End Stone", - "block.exnihiloreborn.compressed_crushed_netherrack": "Compressed Crushed Netherrack", - "block.exnihiloreborn.compressed_dirt": "Compressed Dirt", - "block.exnihiloreborn.compressed_dust": "Compressed Dust", - "block.exnihiloreborn.compressed_sand": "Compressed Sand", "block.exnihiloreborn.crimson_barrel": "Crimson Barrel", "block.exnihiloreborn.crimson_crucible": "Crimson Crucible", "block.exnihiloreborn.crimson_sieve": "Crimson Sieve", @@ -56,29 +50,37 @@ "block.exnihiloreborn.warped_crucible": "Warped Crucible", "block.exnihiloreborn.warped_sieve": "Warped Sieve", "block.exnihiloreborn.witch_water": "Witch Water", + "fluid_type.exnihiloreborn.witch_water": "Witch Water", "generator.exnihiloreborn.void_world": "Void World", "gui.exnihiloreborn.category.barrel_compost": "Barrel Compost", "gui.exnihiloreborn.category.barrel_compost.volume": "Compost: %s", - "gui.exnihiloreborn.category.compressed_hammer": "Compressed Hammer", - "gui.exnihiloreborn.category.compressed_sieve": "Heavy Sieve", - "gui.exnihiloreborn.category.hammer": "Hammer Crucible", + "gui.exnihiloreborn.category.hammer": "Hammer", "gui.exnihiloreborn.category.lava_crucible": "Lava Crucible", "gui.exnihiloreborn.category.sieve": "Sieve", + "gui.exnihiloreborn.category.sieve.average_output": "Avg. Output: %s", + "gui.exnihiloreborn.category.sieve.chance": "Chance: %s%%", + "gui.exnihiloreborn.category.sieve.max_output": "Max: %s", + "gui.exnihiloreborn.category.sieve.min_output": "Min: %s", "gui.exnihiloreborn.category.water_crucible": "Water Crucible", + "info.exnihiloreborn.sieve": "Sieves are used to filter out certain items from soft blocks like gravel and dirt. A mesh is required to use the sieve, and it can be enchanted with Fortune and Efficiency.", "info.exnihiloreborn.silk_worm": "Silk worms have a 1 in 100 chance to drop from leaves harvested with a Crook. Using a silk worm on a tree's leaves will infest them, gradually spreading through the entire tree. 100% infested leaves can be harvested for string, but do not drop saplings.", + "item.exnihiloreborn.andesite_pebble": "Andesite Pebble", "item.exnihiloreborn.bone_crook": "Bone Crook", "item.exnihiloreborn.cooked_silk_worm": "Cooked Silk Worm", - "item.exnihiloreborn.copper_ore_pieces": "Copper Ore Pieces", + "item.exnihiloreborn.copper_ore_chunk": "Copper Ore Chunk", "item.exnihiloreborn.crook": "Crook", "item.exnihiloreborn.deepslate_pebble": "Deepslate Pebble", "item.exnihiloreborn.diamond_hammer": "Diamond Hammer", "item.exnihiloreborn.diamond_mesh": "Diamond Mesh", + "item.exnihiloreborn.diorite_pebble": "Diorite Pebble", "item.exnihiloreborn.flint_mesh": "Flint Mesh", - "item.exnihiloreborn.gold_ore_pieces": "Gold Ore Pieces", + "item.exnihiloreborn.gold_ore_chunk": "Gold Ore Chunk", "item.exnihiloreborn.golden_hammer": "Golden Hammer", + "item.exnihiloreborn.golden_mesh": "Golden Mesh", + "item.exnihiloreborn.granite_pebble": "Granite Pebble", "item.exnihiloreborn.iron_hammer": "Iron Hammer", "item.exnihiloreborn.iron_mesh": "Iron Mesh", - "item.exnihiloreborn.iron_ore_pieces": "Iron Ore Pieces", + "item.exnihiloreborn.iron_ore_chunk": "Iron Ore Chunk", "item.exnihiloreborn.netherite_hammer": "Netherite Hammer", "item.exnihiloreborn.netherite_mesh": "Netherite Mesh", "item.exnihiloreborn.porcelain_bucket": "Porcelain Bucket", @@ -87,6 +89,7 @@ "item.exnihiloreborn.stone_hammer": "Stone Hammer", "item.exnihiloreborn.stone_pebble": "Stone Pebble", "item.exnihiloreborn.string_mesh": "String Mesh", + "item.exnihiloreborn.tuff_pebble": "Tuff Pebble", "item.exnihiloreborn.witch_water_bucket": "Witch Water Bucket", "item.exnihiloreborn.wooden_hammer": "Wooden Hammer", "itemGroup.exnihiloreborn.main": "Ex Nihilo Reborn" diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/gold_ore_pieces.json b/src/generated/resources/assets/exnihiloreborn/models/item/andesite_pebble.json similarity index 53% rename from src/generated/resources/assets/exnihiloreborn/models/item/gold_ore_pieces.json rename to src/generated/resources/assets/exnihiloreborn/models/item/andesite_pebble.json index 96b356ad..2cd958cd 100644 --- a/src/generated/resources/assets/exnihiloreborn/models/item/gold_ore_pieces.json +++ b/src/generated/resources/assets/exnihiloreborn/models/item/andesite_pebble.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "exnihiloreborn:item/gold_ore_pieces" + "layer0": "exnihiloreborn:item/andesite_pebble" } } \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/copper_ore_pieces.json b/src/generated/resources/assets/exnihiloreborn/models/item/copper_ore_chunk.json similarity index 52% rename from src/generated/resources/assets/exnihiloreborn/models/item/copper_ore_pieces.json rename to src/generated/resources/assets/exnihiloreborn/models/item/copper_ore_chunk.json index e6b757d5..75049c41 100644 --- a/src/generated/resources/assets/exnihiloreborn/models/item/copper_ore_pieces.json +++ b/src/generated/resources/assets/exnihiloreborn/models/item/copper_ore_chunk.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "exnihiloreborn:item/copper_ore_pieces" + "layer0": "exnihiloreborn:item/copper_ore_chunk" } } \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/iron_ore_pieces.json b/src/generated/resources/assets/exnihiloreborn/models/item/diorite_pebble.json similarity index 53% rename from src/generated/resources/assets/exnihiloreborn/models/item/iron_ore_pieces.json rename to src/generated/resources/assets/exnihiloreborn/models/item/diorite_pebble.json index 9b0f1d79..355d4c96 100644 --- a/src/generated/resources/assets/exnihiloreborn/models/item/iron_ore_pieces.json +++ b/src/generated/resources/assets/exnihiloreborn/models/item/diorite_pebble.json @@ -1,6 +1,6 @@ { "parent": "minecraft:item/generated", "textures": { - "layer0": "exnihiloreborn:item/iron_ore_pieces" + "layer0": "exnihiloreborn:item/diorite_pebble" } } \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/gold_ore_chunk.json b/src/generated/resources/assets/exnihiloreborn/models/item/gold_ore_chunk.json new file mode 100644 index 00000000..693fea55 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/gold_ore_chunk.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "exnihiloreborn:item/gold_ore_chunk" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/golden_mesh.json b/src/generated/resources/assets/exnihiloreborn/models/item/golden_mesh.json new file mode 100644 index 00000000..c66681f7 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/golden_mesh.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "exnihiloreborn:item/golden_mesh" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/granite_pebble.json b/src/generated/resources/assets/exnihiloreborn/models/item/granite_pebble.json new file mode 100644 index 00000000..600c6171 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/granite_pebble.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "exnihiloreborn:item/granite_pebble" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/iron_ore_chunk.json b/src/generated/resources/assets/exnihiloreborn/models/item/iron_ore_chunk.json new file mode 100644 index 00000000..91961838 --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/iron_ore_chunk.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "exnihiloreborn:item/iron_ore_chunk" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/exnihiloreborn/models/item/tuff_pebble.json b/src/generated/resources/assets/exnihiloreborn/models/item/tuff_pebble.json new file mode 100644 index 00000000..bafd7c4a --- /dev/null +++ b/src/generated/resources/assets/exnihiloreborn/models/item/tuff_pebble.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "exnihiloreborn:item/tuff_pebble" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/core/crook.json b/src/generated/resources/data/exnihiloreborn/advancements/core/crook.json index fa331352..bb7d85f7 100644 --- a/src/generated/resources/data/exnihiloreborn/advancements/core/crook.json +++ b/src/generated/resources/data/exnihiloreborn/advancements/core/crook.json @@ -3,9 +3,13 @@ "criteria": { "craft_crook": { "conditions": { - "recipe_id": "exnihiloreborn:crook" + "items": [ + { + "tag": "exnihiloreborn:crooks" + } + ] }, - "trigger": "minecraft:recipe_crafted" + "trigger": "minecraft:inventory_changed" } }, "display": { diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/misc/andesite.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/misc/andesite.json new file mode 100644 index 00000000..28565357 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/misc/andesite.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "exnihiloreborn:andesite_pebble" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "exnihiloreborn:andesite" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "exnihiloreborn:andesite" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/misc/cobblestone.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/misc/cobblestone.json new file mode 100644 index 00000000..fb3d3cb9 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/misc/cobblestone.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "exnihiloreborn:stone_pebble" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "exnihiloreborn:cobblestone" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "exnihiloreborn:cobblestone" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/misc/copper_ore.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/misc/copper_ore.json new file mode 100644 index 00000000..ee071e59 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/misc/copper_ore.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "exnihiloreborn:copper_ore_chunk" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "exnihiloreborn:copper_ore" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "exnihiloreborn:copper_ore" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/misc/diorite.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/misc/diorite.json new file mode 100644 index 00000000..8935262e --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/misc/diorite.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "exnihiloreborn:diorite_pebble" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "exnihiloreborn:diorite" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "exnihiloreborn:diorite" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/misc/gold_ore.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/misc/gold_ore.json new file mode 100644 index 00000000..6e59bbf0 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/misc/gold_ore.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "exnihiloreborn:gold_ore_chunk" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "exnihiloreborn:gold_ore" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "exnihiloreborn:gold_ore" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/misc/granite.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/misc/granite.json new file mode 100644 index 00000000..75be6394 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/misc/granite.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "exnihiloreborn:granite_pebble" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "exnihiloreborn:granite" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "exnihiloreborn:granite" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/misc/iron_ore.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/misc/iron_ore.json new file mode 100644 index 00000000..148502de --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/misc/iron_ore.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "exnihiloreborn:iron_ore_chunk" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "exnihiloreborn:iron_ore" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "exnihiloreborn:iron_ore" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/misc/string_mesh.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/misc/string_mesh.json new file mode 100644 index 00000000..8e5d65a2 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/misc/string_mesh.json @@ -0,0 +1,33 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "tag": "forge:string" + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "exnihiloreborn:string_mesh" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "exnihiloreborn:string_mesh" + ] + }, + "sends_telemetry_event": true +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/advancements/recipes/tools/netherite_hammer.json b/src/generated/resources/data/exnihiloreborn/advancements/recipes/tools/netherite_hammer.json new file mode 100644 index 00000000..fff1c36d --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/advancements/recipes/tools/netherite_hammer.json @@ -0,0 +1,35 @@ +{ + "parent": "minecraft:recipes/root", + "criteria": { + "has_item": { + "conditions": { + "items": [ + { + "items": [ + "minecraft:netherite_ingot" + ] + } + ] + }, + "trigger": "minecraft:inventory_changed" + }, + "has_the_recipe": { + "conditions": { + "recipe": "exnihiloreborn:netherite_hammer" + }, + "trigger": "minecraft:recipe_unlocked" + } + }, + "requirements": [ + [ + "has_item", + "has_the_recipe" + ] + ], + "rewards": { + "recipes": [ + "exnihiloreborn:netherite_hammer" + ] + }, + "sends_telemetry_event": false +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/acacia_crucible.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/acacia_crucible.json new file mode 100644 index 00000000..08197386 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/acacia_crucible.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:acacia_crucible" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "exnihiloreborn:blocks/acacia_crucible" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/compressed_cobblestone.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/acacia_sieve.json similarity index 73% rename from src/generated/resources/data/exnihiloreborn/loot_tables/blocks/compressed_cobblestone.json rename to src/generated/resources/data/exnihiloreborn/loot_tables/blocks/acacia_sieve.json index 1d950281..6b22fd24 100644 --- a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/compressed_cobblestone.json +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/acacia_sieve.json @@ -11,11 +11,11 @@ "entries": [ { "type": "minecraft:item", - "name": "minecraft:air" + "name": "exnihiloreborn:acacia_sieve" } ], "rolls": 1.0 } ], - "random_sequence": "exnihiloreborn:blocks/compressed_cobblestone" + "random_sequence": "exnihiloreborn:blocks/acacia_sieve" } \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/bamboo_barrel.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/bamboo_barrel.json new file mode 100644 index 00000000..bdf76529 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/bamboo_barrel.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:bamboo_barrel" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "exnihiloreborn:blocks/bamboo_barrel" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/bamboo_crucible.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/bamboo_crucible.json new file mode 100644 index 00000000..ad65cfc3 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/bamboo_crucible.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:bamboo_crucible" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "exnihiloreborn:blocks/bamboo_crucible" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/bamboo_sieve.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/bamboo_sieve.json new file mode 100644 index 00000000..cf93b940 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/bamboo_sieve.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:bamboo_sieve" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "exnihiloreborn:blocks/bamboo_sieve" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/birch_crucible.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/birch_crucible.json new file mode 100644 index 00000000..56663096 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/birch_crucible.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:birch_crucible" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "exnihiloreborn:blocks/birch_crucible" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/compressed_sand.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/birch_sieve.json similarity index 73% rename from src/generated/resources/data/exnihiloreborn/loot_tables/blocks/compressed_sand.json rename to src/generated/resources/data/exnihiloreborn/loot_tables/blocks/birch_sieve.json index acc1ab18..f53be318 100644 --- a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/compressed_sand.json +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/birch_sieve.json @@ -11,11 +11,11 @@ "entries": [ { "type": "minecraft:item", - "name": "minecraft:air" + "name": "exnihiloreborn:birch_sieve" } ], "rolls": 1.0 } ], - "random_sequence": "exnihiloreborn:blocks/compressed_sand" + "random_sequence": "exnihiloreborn:blocks/birch_sieve" } \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/cherry_barrel.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/cherry_barrel.json new file mode 100644 index 00000000..e17e792d --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/cherry_barrel.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:cherry_barrel" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "exnihiloreborn:blocks/cherry_barrel" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/cherry_crucible.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/cherry_crucible.json new file mode 100644 index 00000000..c07f3a30 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/cherry_crucible.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:cherry_crucible" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "exnihiloreborn:blocks/cherry_crucible" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/cherry_sieve.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/cherry_sieve.json new file mode 100644 index 00000000..506e5cc4 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/cherry_sieve.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:cherry_sieve" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "exnihiloreborn:blocks/cherry_sieve" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/crimson_crucible.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/crimson_crucible.json new file mode 100644 index 00000000..deff5da9 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/crimson_crucible.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:crimson_crucible" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "exnihiloreborn:blocks/crimson_crucible" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/crimson_sieve.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/crimson_sieve.json new file mode 100644 index 00000000..1edaba93 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/crimson_sieve.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:crimson_sieve" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "exnihiloreborn:blocks/crimson_sieve" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/crushed_end_stone.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/crushed_end_stone.json new file mode 100644 index 00000000..6f1c2d24 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/crushed_end_stone.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:crushed_end_stone" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "exnihiloreborn:blocks/crushed_end_stone" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/crushed_netherrack.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/crushed_netherrack.json new file mode 100644 index 00000000..389e9c5b --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/crushed_netherrack.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:crushed_netherrack" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "exnihiloreborn:blocks/crushed_netherrack" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/dark_oak_crucible.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/dark_oak_crucible.json new file mode 100644 index 00000000..9dee7ff7 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/dark_oak_crucible.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:dark_oak_crucible" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "exnihiloreborn:blocks/dark_oak_crucible" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/dark_oak_sieve.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/dark_oak_sieve.json new file mode 100644 index 00000000..7cbcaf75 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/dark_oak_sieve.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:dark_oak_sieve" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "exnihiloreborn:blocks/dark_oak_sieve" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/jungle_crucible.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/jungle_crucible.json new file mode 100644 index 00000000..28e2d143 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/jungle_crucible.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:jungle_crucible" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "exnihiloreborn:blocks/jungle_crucible" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/jungle_sieve.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/jungle_sieve.json new file mode 100644 index 00000000..6d1bbf0e --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/jungle_sieve.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:jungle_sieve" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "exnihiloreborn:blocks/jungle_sieve" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/mangrove_barrel.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/mangrove_barrel.json new file mode 100644 index 00000000..1f85aebd --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/mangrove_barrel.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:mangrove_barrel" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "exnihiloreborn:blocks/mangrove_barrel" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/mangrove_crucible.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/mangrove_crucible.json new file mode 100644 index 00000000..0228cddc --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/mangrove_crucible.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:mangrove_crucible" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "exnihiloreborn:blocks/mangrove_crucible" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/mangrove_sieve.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/mangrove_sieve.json new file mode 100644 index 00000000..59428255 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/mangrove_sieve.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:mangrove_sieve" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "exnihiloreborn:blocks/mangrove_sieve" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/oak_crucible.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/oak_crucible.json new file mode 100644 index 00000000..a582a7b0 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/oak_crucible.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:oak_crucible" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "exnihiloreborn:blocks/oak_crucible" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/compressed_dust.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/oak_sieve.json similarity index 74% rename from src/generated/resources/data/exnihiloreborn/loot_tables/blocks/compressed_dust.json rename to src/generated/resources/data/exnihiloreborn/loot_tables/blocks/oak_sieve.json index 366e4b43..a912dc90 100644 --- a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/compressed_dust.json +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/oak_sieve.json @@ -11,11 +11,11 @@ "entries": [ { "type": "minecraft:item", - "name": "minecraft:air" + "name": "exnihiloreborn:oak_sieve" } ], "rolls": 1.0 } ], - "random_sequence": "exnihiloreborn:blocks/compressed_dust" + "random_sequence": "exnihiloreborn:blocks/oak_sieve" } \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/porcelain_crucible.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/porcelain_crucible.json new file mode 100644 index 00000000..f35d5b7c --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/porcelain_crucible.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:porcelain_crucible" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "exnihiloreborn:blocks/porcelain_crucible" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/spruce_crucible.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/spruce_crucible.json new file mode 100644 index 00000000..07a84c37 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/spruce_crucible.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:spruce_crucible" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "exnihiloreborn:blocks/spruce_crucible" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/spruce_sieve.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/spruce_sieve.json new file mode 100644 index 00000000..95a4761d --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/spruce_sieve.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:spruce_sieve" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "exnihiloreborn:blocks/spruce_sieve" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/unfired_crucible.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/unfired_crucible.json new file mode 100644 index 00000000..1374f258 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/unfired_crucible.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:unfired_crucible" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "exnihiloreborn:blocks/unfired_crucible" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/warped_crucible.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/warped_crucible.json new file mode 100644 index 00000000..409bc1c9 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/warped_crucible.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:warped_crucible" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "exnihiloreborn:blocks/warped_crucible" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/warped_sieve.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/warped_sieve.json new file mode 100644 index 00000000..04ceca67 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/warped_sieve.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "exnihiloreborn:warped_sieve" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "exnihiloreborn:blocks/warped_sieve" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/compressed_dirt.json b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/witch_water.json similarity index 84% rename from src/generated/resources/data/exnihiloreborn/loot_tables/blocks/compressed_dirt.json rename to src/generated/resources/data/exnihiloreborn/loot_tables/blocks/witch_water.json index 27cbc7ec..30c39b6d 100644 --- a/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/compressed_dirt.json +++ b/src/generated/resources/data/exnihiloreborn/loot_tables/blocks/witch_water.json @@ -17,5 +17,5 @@ "rolls": 1.0 } ], - "random_sequence": "exnihiloreborn:blocks/compressed_dirt" + "random_sequence": "exnihiloreborn:blocks/witch_water" } \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/andesite.json b/src/generated/resources/data/exnihiloreborn/recipes/andesite.json new file mode 100644 index 00000000..06096b1c --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/andesite.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "exnihiloreborn:andesite_pebble" + } + }, + "pattern": [ + "##", + "##" + ], + "result": { + "item": "minecraft:andesite" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/barrel_mixing/end_stone.json b/src/generated/resources/data/exnihiloreborn/recipes/barrel_mixing/end_stone.json new file mode 100644 index 00000000..98c43fa2 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/barrel_mixing/end_stone.json @@ -0,0 +1,9 @@ +{ + "type": "exnihiloreborn:barrel_mixing", + "fluid_amount": 1000, + "fluid_type": "minecraft:lava", + "ingredient": { + "item": "minecraft:glowstone_dust" + }, + "result": "minecraft:end_stone" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/barrel_mixing/ice.json b/src/generated/resources/data/exnihiloreborn/recipes/barrel_mixing/ice.json new file mode 100644 index 00000000..68a58f85 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/barrel_mixing/ice.json @@ -0,0 +1,9 @@ +{ + "type": "exnihiloreborn:barrel_mixing", + "fluid_amount": 1000, + "fluid_type": "minecraft:water", + "ingredient": { + "item": "minecraft:snowball" + }, + "result": "minecraft:ice" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/barrel_mixing/netherrack.json b/src/generated/resources/data/exnihiloreborn/recipes/barrel_mixing/netherrack.json new file mode 100644 index 00000000..7b0f3596 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/barrel_mixing/netherrack.json @@ -0,0 +1,9 @@ +{ + "type": "exnihiloreborn:barrel_mixing", + "fluid_amount": 1000, + "fluid_type": "minecraft:lava", + "ingredient": { + "item": "minecraft:redstone" + }, + "result": "minecraft:netherrack" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/barrel_mixing/obsidian.json b/src/generated/resources/data/exnihiloreborn/recipes/barrel_mixing/obsidian.json new file mode 100644 index 00000000..1f753cf6 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/barrel_mixing/obsidian.json @@ -0,0 +1,9 @@ +{ + "type": "exnihiloreborn:barrel_mixing", + "fluid_amount": 1000, + "fluid_type": "minecraft:lava", + "ingredient": { + "item": "minecraft:water_bucket" + }, + "result": "minecraft:obsidian" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/barrel_mixing/slime_block.json b/src/generated/resources/data/exnihiloreborn/recipes/barrel_mixing/slime_block.json new file mode 100644 index 00000000..bc68954b --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/barrel_mixing/slime_block.json @@ -0,0 +1,9 @@ +{ + "type": "exnihiloreborn:barrel_mixing", + "fluid_amount": 1000, + "fluid_type": "minecraft:water", + "ingredient": { + "item": "minecraft:milk_bucket" + }, + "result": "minecraft:slime_block" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/barrel_mixing/soul_sand.json b/src/generated/resources/data/exnihiloreborn/recipes/barrel_mixing/soul_sand.json new file mode 100644 index 00000000..aa1e0895 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/barrel_mixing/soul_sand.json @@ -0,0 +1,9 @@ +{ + "type": "exnihiloreborn:barrel_mixing", + "fluid_amount": 1000, + "fluid_type": "exnihiloreborn:witch_water", + "ingredient": { + "item": "minecraft:sand" + }, + "result": "minecraft:soul_sand" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/barrel_mixing/stone.json b/src/generated/resources/data/exnihiloreborn/recipes/barrel_mixing/stone.json new file mode 100644 index 00000000..e98b6835 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/barrel_mixing/stone.json @@ -0,0 +1,9 @@ +{ + "type": "exnihiloreborn:barrel_mixing", + "fluid_amount": 1000, + "fluid_type": "minecraft:water", + "ingredient": { + "item": "minecraft:lava_bucket" + }, + "result": "minecraft:stone" +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/cobblestone.json b/src/generated/resources/data/exnihiloreborn/recipes/cobblestone.json new file mode 100644 index 00000000..77c7abe5 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/cobblestone.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "exnihiloreborn:stone_pebble" + } + }, + "pattern": [ + "##", + "##" + ], + "result": { + "item": "minecraft:cobblestone" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/copper_ore.json b/src/generated/resources/data/exnihiloreborn/recipes/copper_ore.json new file mode 100644 index 00000000..9226c1a2 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/copper_ore.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "exnihiloreborn:copper_ore_chunk" + } + }, + "pattern": [ + "##", + "##" + ], + "result": { + "item": "minecraft:copper_ore" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/diorite.json b/src/generated/resources/data/exnihiloreborn/recipes/diorite.json new file mode 100644 index 00000000..d9d4ef0b --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/diorite.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "exnihiloreborn:diorite_pebble" + } + }, + "pattern": [ + "##", + "##" + ], + "result": { + "item": "minecraft:diorite" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/gold_ore.json b/src/generated/resources/data/exnihiloreborn/recipes/gold_ore.json new file mode 100644 index 00000000..958b6d3a --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/gold_ore.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "exnihiloreborn:gold_ore_chunk" + } + }, + "pattern": [ + "##", + "##" + ], + "result": { + "item": "minecraft:gold_ore" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/granite.json b/src/generated/resources/data/exnihiloreborn/recipes/granite.json new file mode 100644 index 00000000..e6c8bb7f --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/granite.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "exnihiloreborn:granite_pebble" + } + }, + "pattern": [ + "##", + "##" + ], + "result": { + "item": "minecraft:granite" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/hammer/crushed_netherrack.json b/src/generated/resources/data/exnihiloreborn/recipes/hammer/crushed_netherrack.json index 87476a67..ef160818 100644 --- a/src/generated/resources/data/exnihiloreborn/recipes/hammer/crushed_netherrack.json +++ b/src/generated/resources/data/exnihiloreborn/recipes/hammer/crushed_netherrack.json @@ -3,13 +3,6 @@ "ingredient": { "item": "minecraft:netherrack" }, - "rewards": [ - { - "chance": 1.0, - "item": { - "Count": 1, - "id": "exnihiloreborn:crushed_netherrack" - } - } - ] + "result": "exnihiloreborn:crushed_netherrack", + "result_amount": 1.0 } \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/hammer/crushing_red_sandstone.json b/src/generated/resources/data/exnihiloreborn/recipes/hammer/crushing_red_sandstone.json index ade16ed4..7b5b629e 100644 --- a/src/generated/resources/data/exnihiloreborn/recipes/hammer/crushing_red_sandstone.json +++ b/src/generated/resources/data/exnihiloreborn/recipes/hammer/crushing_red_sandstone.json @@ -14,13 +14,6 @@ "item": "minecraft:smooth_red_sandstone" } ], - "rewards": [ - { - "chance": 1.0, - "item": { - "Count": 1, - "id": "minecraft:red_sand" - } - } - ] + "result": "minecraft:red_sand", + "result_amount": 1.0 } \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/hammer/crushing_sandstone.json b/src/generated/resources/data/exnihiloreborn/recipes/hammer/crushing_sandstone.json index d334e116..7dbfa327 100644 --- a/src/generated/resources/data/exnihiloreborn/recipes/hammer/crushing_sandstone.json +++ b/src/generated/resources/data/exnihiloreborn/recipes/hammer/crushing_sandstone.json @@ -14,13 +14,6 @@ "item": "minecraft:smooth_sandstone" } ], - "rewards": [ - { - "chance": 1.0, - "item": { - "Count": 1, - "id": "minecraft:sand" - } - } - ] + "result": "minecraft:sand", + "result_amount": 1.0 } \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/hammer/crushing_stone_bricks.json b/src/generated/resources/data/exnihiloreborn/recipes/hammer/crushing_stone_bricks.json index 754b7231..538d3c76 100644 --- a/src/generated/resources/data/exnihiloreborn/recipes/hammer/crushing_stone_bricks.json +++ b/src/generated/resources/data/exnihiloreborn/recipes/hammer/crushing_stone_bricks.json @@ -3,13 +3,6 @@ "ingredient": { "item": "minecraft:stone_bricks" }, - "rewards": [ - { - "chance": 1.0, - "item": { - "Count": 1, - "id": "minecraft:cracked_stone_bricks" - } - } - ] + "result": "minecraft:cracked_stone_bricks", + "result_amount": 1.0 } \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/hammer/dust.json b/src/generated/resources/data/exnihiloreborn/recipes/hammer/dust.json index 77feb08b..a5e60a7d 100644 --- a/src/generated/resources/data/exnihiloreborn/recipes/hammer/dust.json +++ b/src/generated/resources/data/exnihiloreborn/recipes/hammer/dust.json @@ -3,13 +3,6 @@ "ingredient": { "item": "minecraft:sand" }, - "rewards": [ - { - "chance": 1.0, - "item": { - "Count": 1, - "id": "exnihiloreborn:dust" - } - } - ] + "result": "exnihiloreborn:dust", + "result_amount": 1.0 } \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/hammer/gravel.json b/src/generated/resources/data/exnihiloreborn/recipes/hammer/gravel.json index 9f3e3996..912404c9 100644 --- a/src/generated/resources/data/exnihiloreborn/recipes/hammer/gravel.json +++ b/src/generated/resources/data/exnihiloreborn/recipes/hammer/gravel.json @@ -3,13 +3,6 @@ "ingredient": { "item": "minecraft:cobblestone" }, - "rewards": [ - { - "chance": 1.0, - "item": { - "Count": 1, - "id": "minecraft:gravel" - } - } - ] + "result": "minecraft:gravel", + "result_amount": 1.0 } \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/hammer/sand.json b/src/generated/resources/data/exnihiloreborn/recipes/hammer/sand.json index 04868da5..35964db9 100644 --- a/src/generated/resources/data/exnihiloreborn/recipes/hammer/sand.json +++ b/src/generated/resources/data/exnihiloreborn/recipes/hammer/sand.json @@ -3,13 +3,6 @@ "ingredient": { "item": "minecraft:gravel" }, - "rewards": [ - { - "chance": 1.0, - "item": { - "Count": 1, - "id": "minecraft:sand" - } - } - ] + "result": "minecraft:sand", + "result_amount": 1.0 } \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/hammer/stone_pebbles.json b/src/generated/resources/data/exnihiloreborn/recipes/hammer/stone_pebbles.json index bd7b5675..b03176aa 100644 --- a/src/generated/resources/data/exnihiloreborn/recipes/hammer/stone_pebbles.json +++ b/src/generated/resources/data/exnihiloreborn/recipes/hammer/stone_pebbles.json @@ -4,52 +4,20 @@ { "item": "minecraft:stone" }, + { + "item": "minecraft:stone_bricks" + }, + { + "item": "minecraft:chiseled_stone_bricks" + }, { "item": "minecraft:cracked_stone_bricks" } ], - "rewards": [ - { - "chance": 1.0, - "item": { - "Count": 1, - "id": "exnihiloreborn:stone_pebble" - } - }, - { - "chance": 0.75, - "item": { - "Count": 1, - "id": "exnihiloreborn:stone_pebble" - } - }, - { - "chance": 0.75, - "item": { - "Count": 1, - "id": "exnihiloreborn:stone_pebble" - } - }, - { - "chance": 0.5, - "item": { - "Count": 1, - "id": "exnihiloreborn:stone_pebble" - } - }, - { - "chance": 0.25, - "item": { - "Count": 1, - "id": "exnihiloreborn:stone_pebble" - } - }, - { - "chance": 0.05, - "item": { - "Count": 1, - "id": "exnihiloreborn:stone_pebble" - } - } - ] + "result": "exnihiloreborn:stone_pebble", + "result_amount": { + "type": "minecraft:uniform", + "max": 6.0, + "min": 1.0 + } } \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/iron_ore.json b/src/generated/resources/data/exnihiloreborn/recipes/iron_ore.json new file mode 100644 index 00000000..34473533 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/iron_ore.json @@ -0,0 +1,17 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "#": { + "item": "exnihiloreborn:iron_ore_chunk" + } + }, + "pattern": [ + "##", + "##" + ], + "result": { + "item": "minecraft:iron_ore" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/sieve/beetroot_seeds.json b/src/generated/resources/data/exnihiloreborn/recipes/sieve/beetroot_seeds.json deleted file mode 100644 index 83c4dd43..00000000 --- a/src/generated/resources/data/exnihiloreborn/recipes/sieve/beetroot_seeds.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "type": "exnihiloreborn:sieve", - "ingredient": { - "item": "minecraft:dirt" - }, - "mesh": "exnihiloreborn:string_mesh", - "rewards": [ - { - "chance": 0.35, - "item": { - "Count": 1, - "id": "minecraft:beetroot_seeds" - } - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/sieve/flint/andesite_pebble.json b/src/generated/resources/data/exnihiloreborn/recipes/sieve/flint/andesite_pebble.json new file mode 100644 index 00000000..0ec827a6 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/sieve/flint/andesite_pebble.json @@ -0,0 +1,13 @@ +{ + "type": "exnihiloreborn:sieve", + "ingredient": { + "item": "minecraft:dirt" + }, + "mesh": "exnihiloreborn:flint_mesh", + "result": "exnihiloreborn:andesite_pebble", + "result_amount": { + "type": "minecraft:binomial", + "n": 7.0, + "p": 0.4 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/sieve/flint/beetroot_seeds.json b/src/generated/resources/data/exnihiloreborn/recipes/sieve/flint/beetroot_seeds.json new file mode 100644 index 00000000..9dbe6ce5 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/sieve/flint/beetroot_seeds.json @@ -0,0 +1,13 @@ +{ + "type": "exnihiloreborn:sieve", + "ingredient": { + "item": "minecraft:dirt" + }, + "mesh": "exnihiloreborn:flint_mesh", + "result": "minecraft:beetroot_seeds", + "result_amount": { + "type": "minecraft:binomial", + "n": 1.0, + "p": 0.1 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/sieve/flint/diorite_pebble.json b/src/generated/resources/data/exnihiloreborn/recipes/sieve/flint/diorite_pebble.json new file mode 100644 index 00000000..72f6c217 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/sieve/flint/diorite_pebble.json @@ -0,0 +1,13 @@ +{ + "type": "exnihiloreborn:sieve", + "ingredient": { + "item": "minecraft:dirt" + }, + "mesh": "exnihiloreborn:flint_mesh", + "result": "exnihiloreborn:diorite_pebble", + "result_amount": { + "type": "minecraft:binomial", + "n": 7.0, + "p": 0.4 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/sieve/flint/flint.json b/src/generated/resources/data/exnihiloreborn/recipes/sieve/flint/flint.json new file mode 100644 index 00000000..0c449bd3 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/sieve/flint/flint.json @@ -0,0 +1,13 @@ +{ + "type": "exnihiloreborn:sieve", + "ingredient": { + "item": "minecraft:dirt" + }, + "mesh": "exnihiloreborn:flint_mesh", + "result": "minecraft:flint", + "result_amount": { + "type": "minecraft:binomial", + "n": 1.0, + "p": 0.2 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/sieve/flint/granite_pebble.json b/src/generated/resources/data/exnihiloreborn/recipes/sieve/flint/granite_pebble.json new file mode 100644 index 00000000..2809d865 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/sieve/flint/granite_pebble.json @@ -0,0 +1,13 @@ +{ + "type": "exnihiloreborn:sieve", + "ingredient": { + "item": "minecraft:dirt" + }, + "mesh": "exnihiloreborn:flint_mesh", + "result": "exnihiloreborn:granite_pebble", + "result_amount": { + "type": "minecraft:binomial", + "n": 7.0, + "p": 0.4 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/sieve/flint/melon_seeds.json b/src/generated/resources/data/exnihiloreborn/recipes/sieve/flint/melon_seeds.json new file mode 100644 index 00000000..855ea1db --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/sieve/flint/melon_seeds.json @@ -0,0 +1,13 @@ +{ + "type": "exnihiloreborn:sieve", + "ingredient": { + "item": "minecraft:dirt" + }, + "mesh": "exnihiloreborn:flint_mesh", + "result": "minecraft:melon_seeds", + "result_amount": { + "type": "minecraft:binomial", + "n": 1.0, + "p": 0.1 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/sieve/flint/pumpkin_seeds.json b/src/generated/resources/data/exnihiloreborn/recipes/sieve/flint/pumpkin_seeds.json new file mode 100644 index 00000000..f0295699 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/sieve/flint/pumpkin_seeds.json @@ -0,0 +1,13 @@ +{ + "type": "exnihiloreborn:sieve", + "ingredient": { + "item": "minecraft:dirt" + }, + "mesh": "exnihiloreborn:flint_mesh", + "result": "minecraft:pumpkin_seeds", + "result_amount": { + "type": "minecraft:binomial", + "n": 1.0, + "p": 0.1 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/sieve/flint/stone_pebble.json b/src/generated/resources/data/exnihiloreborn/recipes/sieve/flint/stone_pebble.json new file mode 100644 index 00000000..fddfa532 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/sieve/flint/stone_pebble.json @@ -0,0 +1,13 @@ +{ + "type": "exnihiloreborn:sieve", + "ingredient": { + "item": "minecraft:dirt" + }, + "mesh": "exnihiloreborn:flint_mesh", + "result": "exnihiloreborn:stone_pebble", + "result_amount": { + "type": "minecraft:binomial", + "n": 7.0, + "p": 0.6 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/sieve/flint/wheat_seeds.json b/src/generated/resources/data/exnihiloreborn/recipes/sieve/flint/wheat_seeds.json new file mode 100644 index 00000000..c5524df9 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/sieve/flint/wheat_seeds.json @@ -0,0 +1,13 @@ +{ + "type": "exnihiloreborn:sieve", + "ingredient": { + "item": "minecraft:dirt" + }, + "mesh": "exnihiloreborn:flint_mesh", + "result": "minecraft:wheat_seeds", + "result_amount": { + "type": "minecraft:binomial", + "n": 1.0, + "p": 0.5 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/sieve/melon_seeds.json b/src/generated/resources/data/exnihiloreborn/recipes/sieve/melon_seeds.json deleted file mode 100644 index e3756870..00000000 --- a/src/generated/resources/data/exnihiloreborn/recipes/sieve/melon_seeds.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "type": "exnihiloreborn:sieve", - "ingredient": { - "item": "minecraft:dirt" - }, - "mesh": "exnihiloreborn:string_mesh", - "rewards": [ - { - "chance": 0.35, - "item": { - "Count": 1, - "id": "minecraft:melon_seeds" - } - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/sieve/pumpkin_seeds.json b/src/generated/resources/data/exnihiloreborn/recipes/sieve/pumpkin_seeds.json deleted file mode 100644 index 0993a31a..00000000 --- a/src/generated/resources/data/exnihiloreborn/recipes/sieve/pumpkin_seeds.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "type": "exnihiloreborn:sieve", - "ingredient": { - "item": "minecraft:dirt" - }, - "mesh": "exnihiloreborn:string_mesh", - "rewards": [ - { - "chance": 0.35, - "item": { - "Count": 1, - "id": "minecraft:pumpkin_seeds" - } - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/sieve/stone_pebble.json b/src/generated/resources/data/exnihiloreborn/recipes/sieve/stone_pebble.json deleted file mode 100644 index 91f2db83..00000000 --- a/src/generated/resources/data/exnihiloreborn/recipes/sieve/stone_pebble.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "type": "exnihiloreborn:sieve", - "ingredient": { - "item": "minecraft:dirt" - }, - "mesh": "exnihiloreborn:string_mesh", - "rewards": [ - { - "chance": 1.0, - "item": { - "Count": 1, - "id": "exnihiloreborn:stone_pebble" - } - }, - { - "chance": 1.0, - "item": { - "Count": 1, - "id": "exnihiloreborn:stone_pebble" - } - }, - { - "chance": 1.0, - "item": { - "Count": 1, - "id": "exnihiloreborn:stone_pebble" - } - }, - { - "chance": 0.5, - "item": { - "Count": 1, - "id": "exnihiloreborn:stone_pebble" - } - }, - { - "chance": 0.5, - "item": { - "Count": 1, - "id": "exnihiloreborn:stone_pebble" - } - }, - { - "chance": 0.1, - "item": { - "Count": 1, - "id": "exnihiloreborn:stone_pebble" - } - }, - { - "chance": 0.1, - "item": { - "Count": 1, - "id": "exnihiloreborn:stone_pebble" - } - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/sieve/string/beetroot_seeds.json b/src/generated/resources/data/exnihiloreborn/recipes/sieve/string/beetroot_seeds.json new file mode 100644 index 00000000..554680fb --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/sieve/string/beetroot_seeds.json @@ -0,0 +1,13 @@ +{ + "type": "exnihiloreborn:sieve", + "ingredient": { + "item": "minecraft:dirt" + }, + "mesh": "exnihiloreborn:string_mesh", + "result": "minecraft:beetroot_seeds", + "result_amount": { + "type": "minecraft:binomial", + "n": 1.0, + "p": 0.35 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/sieve/string/flint.json b/src/generated/resources/data/exnihiloreborn/recipes/sieve/string/flint.json new file mode 100644 index 00000000..a9d4fce5 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/sieve/string/flint.json @@ -0,0 +1,13 @@ +{ + "type": "exnihiloreborn:sieve", + "ingredient": { + "item": "minecraft:dirt" + }, + "mesh": "exnihiloreborn:string_mesh", + "result": "minecraft:flint", + "result_amount": { + "type": "minecraft:binomial", + "n": 1.0, + "p": 0.25 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/sieve/string/melon_seeds.json b/src/generated/resources/data/exnihiloreborn/recipes/sieve/string/melon_seeds.json new file mode 100644 index 00000000..7537db58 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/sieve/string/melon_seeds.json @@ -0,0 +1,13 @@ +{ + "type": "exnihiloreborn:sieve", + "ingredient": { + "item": "minecraft:dirt" + }, + "mesh": "exnihiloreborn:string_mesh", + "result": "minecraft:melon_seeds", + "result_amount": { + "type": "minecraft:binomial", + "n": 1.0, + "p": 0.35 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/sieve/string/pumpkin_seeds.json b/src/generated/resources/data/exnihiloreborn/recipes/sieve/string/pumpkin_seeds.json new file mode 100644 index 00000000..697b5199 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/sieve/string/pumpkin_seeds.json @@ -0,0 +1,13 @@ +{ + "type": "exnihiloreborn:sieve", + "ingredient": { + "item": "minecraft:dirt" + }, + "mesh": "exnihiloreborn:string_mesh", + "result": "minecraft:pumpkin_seeds", + "result_amount": { + "type": "minecraft:binomial", + "n": 1.0, + "p": 0.35 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/sieve/string/stone_pebble.json b/src/generated/resources/data/exnihiloreborn/recipes/sieve/string/stone_pebble.json new file mode 100644 index 00000000..cd2e1897 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/sieve/string/stone_pebble.json @@ -0,0 +1,13 @@ +{ + "type": "exnihiloreborn:sieve", + "ingredient": { + "item": "minecraft:dirt" + }, + "mesh": "exnihiloreborn:string_mesh", + "result": "exnihiloreborn:stone_pebble", + "result_amount": { + "type": "minecraft:binomial", + "n": 7.0, + "p": 0.6 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/sieve/string/wheat_seeds.json b/src/generated/resources/data/exnihiloreborn/recipes/sieve/string/wheat_seeds.json new file mode 100644 index 00000000..0e875504 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/sieve/string/wheat_seeds.json @@ -0,0 +1,13 @@ +{ + "type": "exnihiloreborn:sieve", + "ingredient": { + "item": "minecraft:dirt" + }, + "mesh": "exnihiloreborn:string_mesh", + "result": "minecraft:wheat_seeds", + "result_amount": { + "type": "minecraft:binomial", + "n": 1.0, + "p": 0.7 + } +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/sieve/wheat_seeds.json b/src/generated/resources/data/exnihiloreborn/recipes/sieve/wheat_seeds.json deleted file mode 100644 index 615aabf2..00000000 --- a/src/generated/resources/data/exnihiloreborn/recipes/sieve/wheat_seeds.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "type": "exnihiloreborn:sieve", - "ingredient": { - "item": "minecraft:dirt" - }, - "mesh": "exnihiloreborn:string_mesh", - "rewards": [ - { - "chance": 0.7, - "item": { - "Count": 1, - "id": "minecraft:wheat_seeds" - } - } - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/recipes/string_mesh.json b/src/generated/resources/data/exnihiloreborn/recipes/string_mesh.json new file mode 100644 index 00000000..f422f605 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/recipes/string_mesh.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "key": { + "s": { + "tag": "forge:string" + } + }, + "pattern": [ + "sss", + "sss", + "sss" + ], + "result": { + "item": "exnihiloreborn:string_mesh" + }, + "show_notification": true +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/tags/items/pebbles.json b/src/generated/resources/data/exnihiloreborn/tags/items/pebbles.json new file mode 100644 index 00000000..a5ac2823 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/tags/items/pebbles.json @@ -0,0 +1,10 @@ +{ + "values": [ + "exnihiloreborn:stone_pebble", + "exnihiloreborn:diorite_pebble", + "exnihiloreborn:granite_pebble", + "exnihiloreborn:andesite_pebble", + "exnihiloreborn:deepslate_pebble", + "exnihiloreborn:tuff_pebble" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/tags/items/sieve_meshes.json b/src/generated/resources/data/exnihiloreborn/tags/items/sieve_meshes.json new file mode 100644 index 00000000..c16e5f40 --- /dev/null +++ b/src/generated/resources/data/exnihiloreborn/tags/items/sieve_meshes.json @@ -0,0 +1,10 @@ +{ + "values": [ + "exnihiloreborn:string_mesh", + "exnihiloreborn:flint_mesh", + "exnihiloreborn:iron_mesh", + "exnihiloreborn:golden_mesh", + "exnihiloreborn:diamond_mesh", + "exnihiloreborn:netherite_mesh" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/exnihiloreborn/tags/worldgen/structure_set/the_end_void_structure_sets.json b/src/generated/resources/data/exnihiloreborn/tags/worldgen/structure_set/the_end_void_structure_sets.json index f72d209d..84d8fdd4 100644 --- a/src/generated/resources/data/exnihiloreborn/tags/worldgen/structure_set/the_end_void_structure_sets.json +++ b/src/generated/resources/data/exnihiloreborn/tags/worldgen/structure_set/the_end_void_structure_sets.json @@ -1,3 +1,5 @@ { - "values": [] + "values": [ + "minecraft:end_cities" + ] } \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json new file mode 100644 index 00000000..14c17b08 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/axe.json @@ -0,0 +1,37 @@ +{ + "values": [ + "exnihiloreborn:oak_barrel", + "exnihiloreborn:spruce_barrel", + "exnihiloreborn:birch_barrel", + "exnihiloreborn:jungle_barrel", + "exnihiloreborn:acacia_barrel", + "exnihiloreborn:dark_oak_barrel", + "exnihiloreborn:mangrove_barrel", + "exnihiloreborn:cherry_barrel", + "exnihiloreborn:bamboo_barrel", + "exnihiloreborn:crimson_barrel", + "exnihiloreborn:warped_barrel", + "exnihiloreborn:oak_sieve", + "exnihiloreborn:spruce_sieve", + "exnihiloreborn:birch_sieve", + "exnihiloreborn:jungle_sieve", + "exnihiloreborn:acacia_sieve", + "exnihiloreborn:dark_oak_sieve", + "exnihiloreborn:mangrove_sieve", + "exnihiloreborn:cherry_sieve", + "exnihiloreborn:bamboo_sieve", + "exnihiloreborn:crimson_sieve", + "exnihiloreborn:warped_sieve", + "exnihiloreborn:warped_crucible", + "exnihiloreborn:crimson_crucible", + "exnihiloreborn:oak_crucible", + "exnihiloreborn:spruce_crucible", + "exnihiloreborn:birch_crucible", + "exnihiloreborn:jungle_crucible", + "exnihiloreborn:acacia_crucible", + "exnihiloreborn:dark_oak_crucible", + "exnihiloreborn:mangrove_crucible", + "exnihiloreborn:cherry_crucible", + "exnihiloreborn:bamboo_crucible" + ] +} \ 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 00000000..87a85aac --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json @@ -0,0 +1,7 @@ +{ + "values": [ + "exnihiloreborn:stone_barrel", + "exnihiloreborn:porcelain_crucible", + "exnihiloreborn:unfired_crucible" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/fluids/water.json b/src/generated/resources/data/minecraft/tags/fluids/water.json new file mode 100644 index 00000000..52ebf9a9 --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/fluids/water.json @@ -0,0 +1,6 @@ +{ + "values": [ + "exnihiloreborn:witch_water", + "exnihiloreborn:flowing_witch_water" + ] +} \ No newline at end of file diff --git a/src/main/java/thedarkcolour/exnihiloreborn/block/BarrelBlock.java b/src/main/java/thedarkcolour/exnihiloreborn/block/BarrelBlock.java index f5409e5f..6e4d4fa8 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/block/BarrelBlock.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/block/BarrelBlock.java @@ -48,7 +48,7 @@ public class BarrelBlock extends Block implements EntityBlock { @Nullable @Override public BlockEntityTicker getTicker(Level level, BlockState pState, BlockEntityType type) { - return !level.isClientSide && type == EBlockEntities.BARREL.get() ? (BlockEntityTicker) new BarrelBlockEntity.Ticker() : null; + return type == EBlockEntities.BARREL.get() ? (BlockEntityTicker) new BarrelBlockEntity.Ticker() : null; } @Override @@ -73,7 +73,7 @@ public class BarrelBlock extends Block implements EntityBlock { var item = barrel.getItem(); if (!item.isEmpty()) { - Containers.dropContents(level, pos, NonNullList.of(ItemStack.EMPTY, item)); + EBlock.dropItem(level, pos, item); } } } diff --git a/src/main/java/thedarkcolour/exnihiloreborn/block/EBlock.java b/src/main/java/thedarkcolour/exnihiloreborn/block/EBlock.java index c4fc4c44..cdb04ef8 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/block/EBlock.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/block/EBlock.java @@ -1,9 +1,11 @@ package thedarkcolour.exnihiloreborn.block; 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.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.EntityBlock; @@ -38,4 +40,8 @@ public abstract class EBlock extends Block implements EntityBlock { return InteractionResult.PASS; } + + public static void dropItem(Level level, BlockPos pos, ItemStack stack) { + Containers.dropItemStack(level, pos.getX(), pos.getY(), pos.getZ(), stack); + } } diff --git a/src/main/java/thedarkcolour/exnihiloreborn/block/InfestedLeavesBlock.java b/src/main/java/thedarkcolour/exnihiloreborn/block/InfestedLeavesBlock.java index 33e2209d..5c84dfea 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/block/InfestedLeavesBlock.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/block/InfestedLeavesBlock.java @@ -38,13 +38,14 @@ public class InfestedLeavesBlock extends LeavesBlock implements EntityBlock { @Nullable @Override public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { - return !state.getValue(FULLY_INFESTED) ? new InfestedLeavesBlockEntity(pos, state) : null; + return new InfestedLeavesBlockEntity(pos, state); } + @SuppressWarnings("unchecked") @Nullable @Override public BlockEntityTicker getTicker(Level pLevel, BlockState state, BlockEntityType type) { - return (type == EBlockEntities.INFESTED_LEAVES.get() && !state.getValue(FULLY_INFESTED)) ? (BlockEntityTicker) new InfestedLeavesBlockEntity.Ticker() : null; + return (type == EBlockEntities.INFESTED_LEAVES.get()) ? (BlockEntityTicker) new InfestedLeavesBlockEntity.Ticker() : null; } @Override diff --git a/src/main/java/thedarkcolour/exnihiloreborn/block/SieveBlock.java b/src/main/java/thedarkcolour/exnihiloreborn/block/SieveBlock.java index 27189340..b9fca24a 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/block/SieveBlock.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/block/SieveBlock.java @@ -2,26 +2,52 @@ package thedarkcolour.exnihiloreborn.block; import net.minecraft.core.BlockPos; import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.Shapes; import net.minecraft.world.phys.shapes.VoxelShape; import thedarkcolour.exnihiloreborn.blockentity.SieveBlockEntity; import thedarkcolour.exnihiloreborn.registry.EBlockEntities; public class SieveBlock extends EBlock { + public static final VoxelShape SHAPE = Shapes.or( + box(0, 11, 0, 16, 16, 16), + box(1, 0, 1, 2, 11, 2), + box(14, 0, 1, 15, 11, 2), + box(1, 0, 14, 2, 11, 15), + box(14, 0, 14, 15, 11, 15) + ); + public SieveBlock(Properties properties) { super(properties, EBlockEntities.SIEVE); } - // todo @Override public VoxelShape getShape(BlockState state, BlockGetter level, BlockPos pos, CollisionContext context) { - return super.getShape(state, level, pos, context); + return SHAPE; } @Override public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { return new SieveBlockEntity(pos, state); } + + @Override + public void onRemove(BlockState state, Level level, BlockPos pos, BlockState newState, boolean pIsMoving) { + if (!level.isClientSide) { + if (!state.is(newState.getBlock())) { + if (level.getBlockEntity(pos) instanceof SieveBlockEntity sieve) { + var mesh = sieve.getMesh(); + + if (!mesh.isEmpty()) { + dropItem(level, pos, mesh); + } + } + } + } + + super.onRemove(state, level, pos, newState, pIsMoving); + } } diff --git a/src/main/java/thedarkcolour/exnihiloreborn/blockentity/AbstractCrucibleBlockEntity.java b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/AbstractCrucibleBlockEntity.java index c49ca684..c624a049 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/blockentity/AbstractCrucibleBlockEntity.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/AbstractCrucibleBlockEntity.java @@ -1,6 +1,5 @@ package thedarkcolour.exnihiloreborn.blockentity; -import com.google.common.cache.Cache; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; @@ -12,7 +11,6 @@ import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @@ -111,22 +109,7 @@ public abstract class AbstractCrucibleBlockEntity extends EBlockEntity { } // Gets a crucible recipe, using the cache if possible - public CrucibleRecipe getRecipe(ItemStack item) { - var pair = new CacheKey(item.getItem(), item.getTag()); - var recipe = getRecipeCache().getIfPresent(pair); - - if (recipe != null) { - return recipe; - } else { - CrucibleRecipe newRecipe = RecipeUtil.getRecipe(level.getServer(), getRecipeType(), item); - - if (newRecipe != null) { - getRecipeCache().put(pair, newRecipe); // You can't put null values in a cache... - } - - return newRecipe; - } - } + protected abstract CrucibleRecipe getRecipe(ItemStack item); /** * Tries to melt the specified item into the crucible. @@ -167,7 +150,7 @@ public abstract class AbstractCrucibleBlockEntity extends EBlockEntity { } } - public int getMelt() { + public int getMeltingRate() { return 1; } @@ -179,12 +162,8 @@ public abstract class AbstractCrucibleBlockEntity extends EBlockEntity { return tank; } - protected abstract RecipeType getRecipeType(); - protected abstract Block getDefaultMeltBlock(); - protected abstract Cache getRecipeCache(); - public Block getLastMelted() { return lastMelted; } @@ -207,9 +186,6 @@ public abstract class AbstractCrucibleBlockEntity extends EBlockEntity { overrides.put(Items.MANGROVE_PROPAGULE, Blocks.MANGROVE_LEAVES); } - public record CacheKey(Item item, CompoundTag tag) { - } - private static class FluidHandler extends FluidTank { public FluidHandler() { super(4_000); @@ -249,7 +225,7 @@ public abstract class AbstractCrucibleBlockEntity extends EBlockEntity { public void tick(Level level, BlockPos pos, BlockState state, AbstractCrucibleBlockEntity crucible) { // Update twice per tick if ((level.getGameTime() % 10L) == 0L) { - int delta = Math.min(crucible.solids, crucible.getMelt()); + int delta = Math.min(crucible.solids, crucible.getMeltingRate()); // Skip if no heat if (delta <= 0) return; diff --git a/src/main/java/thedarkcolour/exnihiloreborn/blockentity/BarrelBlockEntity.java b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/BarrelBlockEntity.java index 7e368e59..7a6df59f 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/blockentity/BarrelBlockEntity.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/BarrelBlockEntity.java @@ -4,41 +4,39 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.nbt.CompoundTag; -import net.minecraft.util.Mth; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.SimpleContainer; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.BlockEntityTicker; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.material.Fluid; import net.minecraft.world.level.material.Fluids; 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.FluidUtil; 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.joml.Vector3i; import thedarkcolour.exnihiloreborn.client.CompostColors; +import thedarkcolour.exnihiloreborn.recipe.RecipeUtil; import thedarkcolour.exnihiloreborn.registry.EBlockEntities; import thedarkcolour.exnihiloreborn.registry.EFluids; -import thedarkcolour.exnihiloreborn.registry.EItems; -import thedarkcolour.exnihiloreborn.registry.ERecipeTypes; import javax.annotation.Nonnull; import javax.annotation.Nullable; -// todo test which refresh calls can be removed to avoid network spam public class BarrelBlockEntity extends EBlockEntity { private static final float PROGRESS_STEP = 1.0f / 300.0f; @@ -99,15 +97,17 @@ public class BarrelBlockEntity extends EBlockEntity { } public boolean isBurning() { - return hasHotFluid() && progress != 0.0f; + return isHotFluid(tank.getFluid().getFluid().getFluidType()) && progress != 0.0f; } + // Composting is in progress if at 1000. When finished, compost is set back to 0 public boolean isComposting() { return compost == 1000; } - public boolean hasContents() { - return compost > 0 || !item.getStackInSlot(0).isEmpty(); + // Returns true if there are no solid ingredients (can a fluid be inserted?) + public boolean isEmptySolids() { + return compost <= 0 && item.getStackInSlot(0).isEmpty(); } public boolean hasFullWater() { @@ -115,9 +115,9 @@ public class BarrelBlockEntity extends EBlockEntity { } // Burning temp of wood according to google is 300 C or ~575 kelvin - // Molten Constantan from Thermal Expansion is only 650 kelvin, but this should be fine - public boolean hasHotFluid() { - return tank.getFluid().getFluid().getFluidType().getTemperature() > 575; + // Molten Constantan from Thermal Expansion is 650 kelvin, so this should be fine + public static boolean isHotFluid(FluidType fluidType) { + return fluidType.getTemperature() > 575; } private void spawnBurningParticles() { @@ -142,132 +142,142 @@ public class BarrelBlockEntity extends EBlockEntity { } public InteractionResult use(Level level, BlockPos pos, Player player, InteractionHand hand) { - var isClientSide = level.isClientSide; - // Collect an item if (!getItem().isEmpty()) { - return giveItem(level, pos, isClientSide); + return giveResultItem(level, pos, player); } // Handle item fluid interaction - if (!hasContents()) { + if (isEmptySolids()) { var wasBurning = isBurning(); if (FluidUtil.interactWithFluidHandler(player, hand, tank)) { - if (wasBurning && !hasHotFluid()) { + if (wasBurning && !isHotFluid(tank.getFluid().getFluid().getFluidType())) { progress = 0.0f; } - return InteractionResult.sidedSuccess(isClientSide); + return InteractionResult.sidedSuccess(level.isClientSide); } } var playerItem = player.getItemInHand(hand); - - // Handle compost - if (tank.isEmpty()) { - var inventory = new SimpleContainer(playerItem); - - if (compost < 1000) { - if (!level.isClientSide) { - // todo cache items to recipe - level.getServer().getRecipeManager().getRecipeFor(ERecipeTypes.BARREL_COMPOST.get(), inventory, level).ifPresent(recipe -> { - if (!CompostColors.isLoaded()) { - CompostColors.loadColors(); - } - - int oldCompost = compost; - compost = (short) Math.min(1000, compost + recipe.getVolume()); - - if (compost != 0) { - float weightNew = (float) (compost - oldCompost) / compost; - float weightOld = 1 - weightNew; - var color = CompostColors.COLORS.getOrDefault(playerItem.getItem(), new Vector3i(53, 168, 42)); - - r = (short) (weightNew * color.x + weightOld * r); - g = (short) (weightNew * color.y + weightOld * g); - b = (short) (weightNew * color.z + weightOld * b); - - markUpdated(); - - // Consume item - if (!player.getAbilities().instabuild) { - playerItem.shrink(1); - } - } - }); - } - - return InteractionResult.sidedSuccess(isClientSide); + if (!level.isClientSide) { + var remainder = item.insertItem(0, player.getAbilities().instabuild ? playerItem.copy() : playerItem, false); + if (!player.getAbilities().instabuild) { + player.setItemInHand(hand, remainder); } } - // Mixing - if (!playerItem.isEmpty()) { - var fluid = tank.getFluid(); - var container = playerItem.getCraftingRemainingItem(); - - if (fluid.getAmount() == 1000) { - // todo custom mixing recipes - if (doMix(playerItem, isClientSide)) { - if (!isClientSide && playerItem.isEmpty()) { - player.setItemInHand(hand, container); - } - return InteractionResult.sidedSuccess(isClientSide); - } - } - } - - return InteractionResult.CONSUME; + return InteractionResult.sidedSuccess(level.isClientSide); } - private InteractionResult giveItem(Level level, BlockPos pos, boolean isClientSide) { - if (!isClientSide) { + private void addCompost(ItemStack playerItem, int volume, boolean consume) { + int oldCompost = compost; + compost = (short) Math.min(1000, compost + volume); + + if (compost != 0) { + if (!CompostColors.isLoaded()) { + CompostColors.loadColors(); + } + + float weightNew = (float) (compost - oldCompost) / compost; + float weightOld = 1 - weightNew; + var color = CompostColors.COLORS.getOrDefault(playerItem.getItem(), new Vector3i(53, 168, 42)); + + r = (short) (weightNew * color.x + weightOld * r); + g = (short) (weightNew * color.y + weightOld * g); + b = (short) (weightNew * color.z + weightOld * b); + + // Consume item + if (consume) { + playerItem.shrink(1); + } + } + + level.playSound(null, worldPosition, SoundEvents.COMPOSTER_FILL, SoundSource.BLOCKS); + } + + // Pops the item out of the barrel (ex. dirt that has finished composting) + private InteractionResult giveResultItem(Level level, BlockPos pos, Player player) { + var rand = level.random; + if (!level.isClientSide) { // Pop out item var itemEntity = new ItemEntity(level, pos.getX() + 0.5, pos.getY() + 1.5, pos.getZ() + 0.5, item.extract(false)); - var rand = level.random; itemEntity.setDeltaMovement(rand.nextGaussian() * 0.05, 0.2, rand.nextGaussian() * 0.05); level.addFreshEntity(itemEntity); // Empty contents setItem(ItemStack.EMPTY); + markUpdated(); } - return InteractionResult.sidedSuccess(isClientSide); + return InteractionResult.sidedSuccess(level.isClientSide); } /** - * @param fluid Fluid in the barrel - * @param catalyst Item to mix with the fluid - * @param result Item (preferable a block) crafted by this mix - * @param playerItem Player's item to check and consume (test item if simulated) - * @param simulate Whether to simulate the mix - * @return if the mix succeeded (if simulated, whether the mix is possible) + * @param input The input item to craft with + * @param simulate Whether the craft should actually take place + * @return The resulting item after crafting */ - private boolean mix(Fluid fluid, Item catalyst, Item result, ItemStack playerItem, boolean simulate) { - if (tank.getFluid().getFluid() == fluid && playerItem.getItem() == catalyst) { + private ItemStack tryCrafting(ItemStack input, boolean simulate) { + boolean crafted = false; + var remainder = input.getCraftingRemainingItem(); + if (!tank.isEmpty()) { + crafted = tryMixing(input, simulate); + } else if (!isComposting()) { + crafted = tryComposting(input, simulate); + } + + if (crafted) { + if (!simulate) { + markUpdated(); + } + return remainder; + } else { + return input; + } + } + + /** + * @param playerItem The item to try to mix with this barrel's fluid + * @param simulate Whether this is a test or the player is actually mixing with the barrel + * @return Whether something was mixed (if simulated, whether the mix is possible) + */ + private boolean tryMixing(ItemStack playerItem, boolean simulate) { + var recipe = RecipeUtil.getBarrelMixingRecipe(level.getRecipeManager(), playerItem, this.tank.getFluid()); + + if (recipe != null) { + if (isBurning()) { + return false; + } if (!simulate) { // Consumer player input playerItem.shrink(1); // Empty barrel tank.setFluid(FluidStack.EMPTY); // Replace fluid with result - setItem(new ItemStack(result)); + setItem(new ItemStack(recipe.result)); + level.playSound(null, worldPosition, SoundEvents.AMBIENT_UNDERWATER_EXIT, SoundSource.BLOCKS, 0.8f, 0.8f); } - + // Mixing was successful, so return true return true; + } else { + return false; } - - return false; } - private boolean doMix(ItemStack playerItem, boolean simulate) { - return mix(Fluids.WATER, EItems.DUST.get(), Items.CLAY, playerItem, simulate) || - mix(Fluids.WATER, Items.MILK_BUCKET, Items.SLIME_BLOCK, playerItem, simulate) || - mix(EFluids.WITCH_WATER_STILL.get(), Items.SAND, Items.SOUL_SAND, playerItem, simulate) || - mix(Fluids.LAVA, Items.REDSTONE, Items.NETHERRACK, playerItem, simulate) || - mix(Fluids.LAVA, Items.GLOWSTONE_DUST, Items.END_STONE, playerItem, simulate) || - mix(Fluids.LAVA, Items.WATER_BUCKET, Items.OBSIDIAN, playerItem, simulate); + private boolean tryComposting(ItemStack stack, boolean simulate) { + if (simulate) { + return RecipeUtil.isCompostable(stack); + } else { + var recipe = RecipeUtil.getBarrelCompostRecipe(stack); + if (recipe != null) { + addCompost(stack, recipe.getVolume(), true); + return true; + } else { + return false; + } + } } public static class Ticker implements BlockEntityTicker { @@ -276,14 +286,7 @@ public class BarrelBlockEntity extends EBlockEntity { if (!level.isClientSide) { // Turn compost to dirt if (barrel.isComposting()) { - barrel.progress += PROGRESS_STEP; - barrel.markUpdated(); - - if (barrel.progress >= 1.0f) { - barrel.progress = 0.0f; - barrel.compost = 0; - barrel.setItem(new ItemStack(Items.DIRT)); - } + barrel.doCompost(); } else if (barrel.hasFullWater()) { var rand = level.random; var mycelium = 0f; @@ -318,7 +321,7 @@ public class BarrelBlockEntity extends EBlockEntity { barrel.tank.setFluid(new FluidStack(EFluids.WITCH_WATER_STILL.get(), barrel.tank.getFluidAmount())); } - } else if (barrel.hasHotFluid()) { + } else if (isHotFluid(barrel.tank.getFluid().getFluid().getFluidType())) { if (state.ignitedByLava()) { if ((barrel.progress += PROGRESS_STEP) >= 1.0f) { if (barrel.tank.getFluidAmount() == 1000) { @@ -337,6 +340,18 @@ public class BarrelBlockEntity extends EBlockEntity { } } + private void doCompost() { + progress += PROGRESS_STEP; + markUpdated(); + + if (progress >= 1.0f) { + progress = 0.0f; + compost = 0; + setItem(new ItemStack(Items.DIRT)); + level.playSound(null, worldPosition, SoundEvents.COMPOSTER_READY, SoundSource.BLOCKS); + } + } + // Inner class private class ItemHandler extends ItemStackHandler { @Override @@ -346,23 +361,36 @@ public class BarrelBlockEntity extends EBlockEntity { @Override public boolean isItemValid(int slot, @Nonnull ItemStack stack) { - FluidStack fluid = tank.getFluid(); + // if the resulting item from crafting is different (ex. EMPTY or bucket) then we can craft with it + return !ItemStack.matches(tryCrafting(stack, true), stack); + } - if (fluid.getAmount() == 1000) { - return doMix(stack, true); - } + // Copy of ItemStackHandler.insertItem which handles barrel crafting remainders better + @Override + public @NotNull ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) { + if (stack.isEmpty()) + return ItemStack.EMPTY; + validateSlotIndex(slot); + if (!stacks.get(slot).isEmpty()) + return stack; - return false; + return tryCrafting(stack, simulate); } public ItemStack extract(boolean simulate) { return extractItem(0, 1, simulate); } + @Override + public @NotNull ItemStack extractItem(int slot, int amount, boolean simulate) { + return super.extractItem(slot, amount, simulate); + } + @Override protected void onContentsChanged(int slot) { - doMix(stacks.get(slot).copy(), level.isClientSide); - markUpdated(); + if (!level.isClientSide) { + markUpdated(); + } } } @@ -374,7 +402,7 @@ public class BarrelBlockEntity extends EBlockEntity { @Override public boolean isFluidValid(FluidStack stack) { - return !isBrewing() && !hasContents(); + return !isBrewing() && BarrelBlockEntity.this.isEmptySolids(); } } } diff --git a/src/main/java/thedarkcolour/exnihiloreborn/blockentity/EBlockEntity.java b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/EBlockEntity.java index d2a61b3a..7a7d61f0 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/blockentity/EBlockEntity.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/EBlockEntity.java @@ -1,16 +1,23 @@ package thedarkcolour.exnihiloreborn.blockentity; import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.Connection; import net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket; 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.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkStatus; +import net.minecraft.world.level.chunk.LevelChunk; +import net.minecraftforge.network.NetworkDirection; +import thedarkcolour.exnihiloreborn.network.NetworkHandler; +import thedarkcolour.exnihiloreborn.network.VoidWorldMessage; import javax.annotation.Nullable; @@ -39,7 +46,6 @@ public abstract class EBlockEntity extends BlockEntity { } } - // todo replace with smaller PropertyUpdate packets so we don't send a bunch of data every tick protected void markUpdated() { setChanged(); level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), 2); diff --git a/src/main/java/thedarkcolour/exnihiloreborn/blockentity/InfestedLeavesBlockEntity.java b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/InfestedLeavesBlockEntity.java index 078b20c7..fb7f385a 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/blockentity/InfestedLeavesBlockEntity.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/InfestedLeavesBlockEntity.java @@ -10,12 +10,13 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.entity.BlockEntityTicker; import net.minecraft.world.level.block.state.BlockState; +import thedarkcolour.exnihiloreborn.block.InfestedLeavesBlock; import thedarkcolour.exnihiloreborn.registry.EBlockEntities; import thedarkcolour.exnihiloreborn.registry.EBlocks; public class InfestedLeavesBlockEntity extends EBlockEntity { public static final float PROGRESS_INTERVAL = 0.005f; - public static final int SPREAD_INTERVAL = 100; + public static final int SPREAD_INTERVAL = 50; // A percentage of how much this leaf is infested private float progress; @@ -93,6 +94,9 @@ public class InfestedLeavesBlockEntity extends EBlockEntity { // Do progress if (leaves.progress < 1.0f) { leaves.progress = Math.min(1.0f, leaves.progress + PROGRESS_INTERVAL); + if (leaves.progress == 1.0f) { + level.setBlock(pos, state.setValue(InfestedLeavesBlock.FULLY_INFESTED, true), 3); + } } // If the leave is infested enough, advance the spread timer diff --git a/src/main/java/thedarkcolour/exnihiloreborn/blockentity/LavaCrucibleBlockEntity.java b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/LavaCrucibleBlockEntity.java index 69bdd91c..eaa4408d 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/blockentity/LavaCrucibleBlockEntity.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/LavaCrucibleBlockEntity.java @@ -1,21 +1,17 @@ package thedarkcolour.exnihiloreborn.blockentity; -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import net.minecraft.core.BlockPos; -import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; +import thedarkcolour.exnihiloreborn.recipe.RecipeUtil; import thedarkcolour.exnihiloreborn.recipe.crucible.CrucibleRecipe; import thedarkcolour.exnihiloreborn.registry.EBlockEntities; -import thedarkcolour.exnihiloreborn.registry.ERecipeTypes; public class LavaCrucibleBlockEntity extends AbstractCrucibleBlockEntity { - public static final Cache RECIPES_CACHE = CacheBuilder.newBuilder().maximumSize(12).build(); - // todo add KubeJS support for this private static final Object2IntMap HEAT_REGISTRY = new Object2IntOpenHashMap<>(); @@ -34,24 +30,19 @@ public class LavaCrucibleBlockEntity extends AbstractCrucibleBlockEntity { } @Override - public int getMelt() { + public int getMeltingRate() { BlockState state = level.getBlockState(getBlockPos().below()); return HEAT_REGISTRY.getInt(state.getBlock()); } @Override - protected RecipeType getRecipeType() { - return ERecipeTypes.LAVA_CRUCIBLE.get(); + protected CrucibleRecipe getRecipe(ItemStack item) { + return RecipeUtil.getLavaCrucibleRecipe(item); } @Override protected Block getDefaultMeltBlock() { return Blocks.COBBLESTONE; } - - @Override - protected Cache getRecipeCache() { - return RECIPES_CACHE; - } } diff --git a/src/main/java/thedarkcolour/exnihiloreborn/blockentity/RecipeUtil.java b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/RecipeUtil.java deleted file mode 100644 index 6e4ed79e..00000000 --- a/src/main/java/thedarkcolour/exnihiloreborn/blockentity/RecipeUtil.java +++ /dev/null @@ -1,42 +0,0 @@ -package thedarkcolour.exnihiloreborn.blockentity; - -import net.minecraft.server.MinecraftServer; -import net.minecraft.world.Container; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Recipe; -import net.minecraft.world.item.crafting.RecipeType; -import thedarkcolour.exnihiloreborn.recipe.SingleIngredientRecipe; -import thedarkcolour.exnihiloreborn.recipe.sieve.SieveRecipe; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -public final class RecipeUtil { - public static List getSieveResults(MinecraftServer server, RecipeType type, ItemStack mesh, ItemStack item) { - ArrayList recipes = new ArrayList<>(); - - for (T recipe : byType(server, type)) { - if (recipe.test(mesh.getItem(), item)) { - recipes.add(recipe); - } - } - - return recipes.isEmpty() ? Collections.emptyList() : recipes; - } - - public static T getRecipe(MinecraftServer server, RecipeType type, ItemStack item) { - for (T recipe : byType(server, type)) { - if (recipe.getIngredient().test(item)) { - return recipe; - } - } - - return null; - } - - public static > Collection byType(MinecraftServer server, RecipeType type) { - return server.getRecipeManager().byType(type).values(); - } -} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/blockentity/SieveBlockEntity.java b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/SieveBlockEntity.java index 2d3e4506..2012e6e7 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/blockentity/SieveBlockEntity.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/SieveBlockEntity.java @@ -1,67 +1,45 @@ package thedarkcolour.exnihiloreborn.blockentity; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.Level; 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 thedarkcolour.exnihiloreborn.recipe.Reward; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.LootParams; +import thedarkcolour.exnihiloreborn.recipe.RecipeUtil; import thedarkcolour.exnihiloreborn.recipe.sieve.SieveRecipe; import thedarkcolour.exnihiloreborn.registry.EBlockEntities; -import thedarkcolour.exnihiloreborn.registry.EItems; -import thedarkcolour.exnihiloreborn.registry.ERecipeTypes; +import thedarkcolour.exnihiloreborn.tag.EItemTags; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.util.Collections; -import java.util.List; +import java.util.Map; public class SieveBlockEntity extends EBlockEntity { public static final short MAX_SIEVE_CAPACITY = 100; public static final short SIEVE_INTERVAL = 10; - private final SieveBlockEntity.ItemHandler item = new SieveBlockEntity.ItemHandler(); + private ItemStack contents = ItemStack.EMPTY; private ItemStack mesh = ItemStack.EMPTY; private short progress = 0; // Max is 100 - - // Does not persist in NBT, just a cache - // todo invalidate on /reload - private List currentRecipe = Collections.emptyList(); + private float efficiency = 1f; + private float fortune = 1f; public SieveBlockEntity(BlockPos pos, BlockState state) { super(EBlockEntities.SIEVE.get(), pos, state); } - // Capabilities - private final LazyOptional itemHandler = LazyOptional.of(() -> item); - - @Nonnull - @Override - public LazyOptional getCapability(@Nonnull Capability cap, @Nullable Direction side) { - if (cap == ForgeCapabilities.ITEM_HANDLER) { - return itemHandler.cast(); - } - - return super.getCapability(cap, side); - } - @Override protected void saveAdditional(CompoundTag nbt) { super.saveAdditional(nbt); - nbt.put("item", item.serializeNBT()); - nbt.putShort("Progress", progress); + nbt.put("contents", contents.serializeNBT()); + nbt.putShort("progress", progress); if (!mesh.isEmpty()) { nbt.put("mesh", mesh.save(new CompoundTag())); } @@ -69,10 +47,16 @@ public class SieveBlockEntity extends EBlockEntity { @Override public void load(CompoundTag nbt) { - item.deserializeNBT(nbt.getCompound("item")); - progress = nbt.getShort("progress"); + if (nbt.contains("contents")) { + this.contents = ItemStack.of(nbt.getCompound("contents")); + } else { + this.contents = ItemStack.EMPTY; + } + this.progress = nbt.getShort("progress"); if (nbt.contains("mesh")) { - mesh = ItemStack.of(nbt.getCompound("Mesh")); + setMesh(ItemStack.of(nbt.getCompound("mesh"))); + } else { + setMesh(ItemStack.EMPTY); } super.load(nbt); @@ -85,111 +69,183 @@ public class SieveBlockEntity extends EBlockEntity { // Try insert mesh if (mesh.isEmpty()) { if (isMesh(playerItem)) { - mesh = playerItem.copy(); - mesh.setCount(1); + if (!level.isClientSide) { + var meshCopy = playerItem.copy(); + meshCopy.setCount(1); + setMesh(meshCopy); - // Remove stack - if (!player.isCreative()) { - player.setItemInHand(hand, ItemStack.EMPTY); + markUpdated(); + + if (!player.getAbilities().instabuild) { + playerItem.shrink(1); + } + return InteractionResult.CONSUME; + } else { + return InteractionResult.SUCCESS; } } + } else if (contents.isEmpty()) { + // remove mesh with sneak right click + if (player.isShiftKeyDown() && player.getMainHandItem().isEmpty()) { + removeMesh(); + } } - if (progress == 0) { + if (contents.isEmpty()) { // Insert an item if (!isClientSide) { - // Check against cached recipe - if (!currentRecipe.isEmpty()) { - for (SieveRecipe recipe : currentRecipe) { - if (!recipe.test(mesh.getItem(), playerItem)) { - return InteractionResult.CONSUME; - } - } + if (RecipeUtil.hasSieveResult(level.getRecipeManager(), mesh.getItem(), playerItem)) { + playerItem = this.insertContents(player, hand); + markUpdated(); - player.setItemInHand(hand, fillWithItem(playerItem)); - markUpdated(); - } else if (!(currentRecipe = getResults(playerItem)).isEmpty()) { - player.setItemInHand(hand, fillWithItem(playerItem)); - markUpdated(); + var cursor = worldPosition.mutable().move(-1, 0, -1); + + // Fill adjacent sieves + otherSieves: + for (int x = -1; x <= 1; x++) { + for (int z = -1; z <= 1; z++) { + if (playerItem.isEmpty()) { + break otherSieves; + } + + if ((x | z) != 0) { + if (level.getBlockEntity(cursor) instanceof SieveBlockEntity other) { + if (other.contents.isEmpty()) { + if (this.mesh.getItem() == other.mesh.getItem()) { + playerItem = other.insertContents(player, hand); + other.markUpdated(); + } + } + } + } + + cursor.move(0, 0, 1); + } + cursor.move(1, 0, -3); + } } } } else { - // todo mesh efficiency enchantment - progress -= SIEVE_INTERVAL; + var cursor = worldPosition.mutable().move(-1, 0, -1); - if (progress <= 0) { - progress = 0; + // Sieve with adjacent sieves + for (int x = -1; x <= 1; x++) { + for (int z = -1; z <= 1; z++) { + if (level.getBlockEntity(cursor) instanceof SieveBlockEntity other) { + if (!other.contents.isEmpty()) { + if (this.mesh.getItem() == other.mesh.getItem()) { + other.performSift(player); + } + } + } - if (!isClientSide) { - giveItems(); + cursor.move(0, 0, 1); } + cursor.move(1, 0, -3); } } return InteractionResult.sidedSuccess(isClientSide); } - // Consumes an item and fills the sieve. - private ItemStack fillWithItem(ItemStack stack) { - progress = MAX_SIEVE_CAPACITY; + // Fills the sieve (assumes contents is EMPTY) and returns the remaining item, putting it in the player's hand + private ItemStack insertContents(Player player, InteractionHand hand) { + var consume = !player.getAbilities().instabuild; + var playerItem = player.getItemInHand(hand); - return item.insertItem(0, stack, false); + if (consume) { + if (playerItem.getCount() == 1) { + this.contents = playerItem; + player.setItemInHand(hand, ItemStack.EMPTY); + playerItem = ItemStack.EMPTY; + } else { + this.contents = singleCopy(playerItem); + playerItem.shrink(1); + } + } else { + this.contents = singleCopy(playerItem); + } + + this.progress = MAX_SIEVE_CAPACITY; + + return playerItem; } - private void giveItems() { - var pos = getBlockPos(); - var rand = level.random; + private static ItemStack singleCopy(ItemStack stack) { + var copy = stack.copy(); + copy.setCount(1); + return copy; + } - for (SieveRecipe recipe : currentRecipe) { - for (Reward reward : recipe.getRewards()) { - if (rand.nextFloat() < reward.getChance()) { - var itemEntity = new ItemEntity(level, pos.getX() + 0.5, pos.getY() + 1.5, pos.getZ() + 0.5, reward.getItem().copy()); - itemEntity.setDeltaMovement(rand.nextGaussian() * 0.05, 0.2, rand.nextGaussian() * 0.05); - level.addFreshEntity(itemEntity); - } + private void performSift(Player player) { + progress -= efficiency * SIEVE_INTERVAL; + + if (progress <= 0) { + progress = 0; + + if (!level.isClientSide) { + giveItems(player); + } + } + } + + private InteractionResult removeMesh() { + if (!level.isClientSide) { + // Pop out item + var itemEntity = new ItemEntity(level, worldPosition.getX() + 0.5, worldPosition.getY() + 1.5, worldPosition.getZ() + 0.5, mesh); + var rand = level.random; + itemEntity.setDeltaMovement(rand.nextGaussian() * 0.05, 0.2, rand.nextGaussian() * 0.05); + level.addFreshEntity(itemEntity); + + // Empty contents + setMesh(ItemStack.EMPTY); + markUpdated(); + } + + return InteractionResult.sidedSuccess(level.isClientSide); + } + + private void setMesh(ItemStack mesh) { + this.mesh = mesh; + this.efficiency = 1f + mesh.getEnchantmentLevel(Enchantments.BLOCK_EFFICIENCY) * 0.08f; + // Fortune III increases drops by 120% (you should enchant your meshes!) + this.fortune = 1f + mesh.getEnchantmentLevel(Enchantments.BLOCK_FORTUNE) * 0.4f; + } + + private void giveItems(Player player) { + var pos = this.worldPosition; + var context = new LootContext.Builder(new LootParams((ServerLevel) this.level, Map.of(), Map.of(), player.getLuck())).create(null); + var rand = this.level.random; + + for (SieveRecipe recipe : RecipeUtil.getSieveRecipes(level.getRecipeManager(), this.mesh.getItem(), this.contents)) { + var amount = recipe.resultAmount.getInt(context); + + if (amount >= 1) { + var itemEntity = new ItemEntity(this.level, pos.getX() + 0.5, pos.getY() + 1.5, pos.getZ() + 0.5, new ItemStack(recipe.result, amount)); + itemEntity.setDeltaMovement(rand.nextGaussian() * 0.05, 0.2, rand.nextGaussian() * 0.05); + this.level.addFreshEntity(itemEntity); } } - item.setStackInSlot(0, ItemStack.EMPTY); + this.contents = ItemStack.EMPTY; markUpdated(); } private boolean isMesh(ItemStack stack) { - var item = stack.getItem(); - return item == EItems.STRING_MESH.get() || item == EItems.FLINT_MESH.get() || item == EItems.IRON_MESH.get() || item == EItems.DIAMOND_MESH.get() || item == EItems.NETHERITE_MESH.get(); + return stack.is(EItemTags.SIEVE_MESHES); } + public ItemStack getMesh() { + return this.mesh; + } + + // Used for rendering public short getProgress() { - return progress; + return this.progress; } - public ItemStack getItem() { - return item.getStackInSlot(0); - } - - public List getResults(ItemStack stack) { - return RecipeUtil.getSieveResults(level.getServer(), getRecipeType(), mesh, stack); - } - - public RecipeType getRecipeType() { - return ERecipeTypes.SIEVE.get(); - } - - private class ItemHandler extends ItemStackHandler { - @Override - public boolean isItemValid(int slot, @Nonnull ItemStack stack) { - return !getResults(stack).isEmpty(); - } - - @Override - protected int getStackLimit(int slot, @Nonnull ItemStack stack) { - return 1; - } - - @Nonnull - @Override - public ItemStack extractItem(int slot, int amount, boolean simulate) { - return ItemStack.EMPTY; - } + // Used for rendering + public ItemStack getContents() { + return this.contents; } } diff --git a/src/main/java/thedarkcolour/exnihiloreborn/blockentity/WaterCrucibleBlockEntity.java b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/WaterCrucibleBlockEntity.java index f37b3244..b7de627a 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/blockentity/WaterCrucibleBlockEntity.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/blockentity/WaterCrucibleBlockEntity.java @@ -1,43 +1,26 @@ package thedarkcolour.exnihiloreborn.blockentity; -import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; +import thedarkcolour.exnihiloreborn.recipe.RecipeUtil; import thedarkcolour.exnihiloreborn.recipe.crucible.CrucibleRecipe; import thedarkcolour.exnihiloreborn.registry.EBlockEntities; -import thedarkcolour.exnihiloreborn.registry.ERecipeTypes; public class WaterCrucibleBlockEntity extends AbstractCrucibleBlockEntity { - public static final Cache RECIPES_CACHE = CacheBuilder.newBuilder().maximumSize(12).build(); - public WaterCrucibleBlockEntity(BlockPos pos, BlockState state) { super(EBlockEntities.WATER_CRUCIBLE.get(), pos, state); } @Override - public CrucibleRecipe getRecipe(ItemStack item) { - return super.getRecipe(item); - } - - @Override - protected RecipeType getRecipeType() { - return ERecipeTypes.WATER_CRUCIBLE.get(); + protected CrucibleRecipe getRecipe(ItemStack item) { + return RecipeUtil.getWaterCrucibleRecipe(item); } @Override protected Block getDefaultMeltBlock() { return Blocks.OAK_LEAVES; } - - @Override - protected Cache getRecipeCache() { - return RECIPES_CACHE; - } } diff --git a/src/main/java/thedarkcolour/exnihiloreborn/client/ClientHandler.java b/src/main/java/thedarkcolour/exnihiloreborn/client/ClientHandler.java index 325de224..30086f84 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/client/ClientHandler.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/client/ClientHandler.java @@ -5,6 +5,7 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.util.Mth; import net.minecraftforge.client.event.ClientPlayerNetworkEvent; import net.minecraftforge.client.event.EntityRenderersEvent; +import net.minecraftforge.client.event.RegisterClientReloadListenersEvent; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @@ -17,6 +18,7 @@ import thedarkcolour.exnihiloreborn.registry.EBlockEntities; import thedarkcolour.exnihiloreborn.registry.EFluids; import java.awt.Color; +import java.util.concurrent.CompletableFuture; public class ClientHandler { public static void register() { @@ -25,10 +27,17 @@ public class ClientHandler { modBus.addListener(ClientHandler::clientSetup); modBus.addListener(ClientHandler::registerRenderers); + modBus.addListener(ClientHandler::addClientReloadListeners); fmlBus.addListener(ClientHandler::onPlayerRespawn); fmlBus.addListener(ClientHandler::onPlayerLogout); } + private static void addClientReloadListeners(RegisterClientReloadListenersEvent event) { + event.registerReloadListener((prepBarrier, resourceManager, prepProfiler, reloadProfiler, backgroundExecutor, gameExecutor) -> { + return CompletableFuture.allOf().thenCompose(prepBarrier::wait).thenRunAsync(RenderUtil::reload, gameExecutor); + }); + } + private static void clientSetup(FMLClientSetupEvent event) { event.enqueueWork(ClientHandler::setRenderLayers); } diff --git a/src/main/java/thedarkcolour/exnihiloreborn/client/CompostColors.java b/src/main/java/thedarkcolour/exnihiloreborn/client/CompostColors.java index 0b96a9ff..c6411455 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/client/CompostColors.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/client/CompostColors.java @@ -8,6 +8,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.inventory.InventoryMenu; import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; import net.minecraftforge.client.model.data.ModelData; import net.minecraftforge.fml.ModList; import net.minecraftforge.registries.ForgeRegistries; @@ -45,7 +46,7 @@ public class CompostColors { } public static boolean isLoaded() { - return COLORS.isEmpty(); + return !COLORS.isEmpty(); } private static void loadVanilla() { @@ -130,7 +131,15 @@ public class CompostColors { } if (pixels > 0 && (r | g | b) != 0) { - Color c = new Color(r / pixels, g / pixels, b / pixels).brighter(); + var tint = Minecraft.getInstance().getItemColors().getColor(new ItemStack(item), 0); + Color c = new Color( + r / pixels * (tint >> 16) & 0xff, + g / pixels * (tint >> 8) & 0xff, + b / pixels * tint & 0xff + ); + // do not brighten a tinted texture + if (tint == 0) c = c.brighter(); + Vector3i color = new Vector3i(c.getRed(), c.getGreen(), c.getBlue()); ExNihiloReborn.LOGGER.debug("Item '{}' has color ({}, {}, {})\n", entry.getKey().location(), color.x, color.y, color.z); CompostColors.COLORS.put(item, color); diff --git a/src/main/java/thedarkcolour/exnihiloreborn/client/RenderUtil.java b/src/main/java/thedarkcolour/exnihiloreborn/client/RenderUtil.java new file mode 100644 index 00000000..705b174b --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/client/RenderUtil.java @@ -0,0 +1,97 @@ +package thedarkcolour.exnihiloreborn.client; + +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.texture.MissingTextureAtlasSprite; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.inventory.InventoryMenu; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.levelgen.LegacyRandomSource; +import net.minecraftforge.client.model.data.ModelData; +import net.minecraftforge.registries.ForgeRegistries; +import org.joml.Vector3f; +import thedarkcolour.exnihiloreborn.client.ter.SieveRenderer; + +public class RenderUtil { + public static final LoadingCache TOP_RENDER_TYPES; + public static final LoadingCache TOP_TEXTURES; + public static TextureAtlas blockAtlas; + + static { + TOP_RENDER_TYPES = CacheBuilder.newBuilder().maximumSize(10).build(new CacheLoader<>() { + @Override + public RenderType load(Block key) { + var rand = new LegacyRandomSource(key.hashCode()); + var blockTypes = Minecraft.getInstance().getBlockRenderer().getBlockModel(key.defaultBlockState()).getRenderTypes(key.defaultBlockState(), rand, ModelData.EMPTY); + return RenderType.chunkBufferLayers().stream().filter(blockTypes::contains).findFirst().get(); + } + }); + TOP_TEXTURES = CacheBuilder.newBuilder().weakValues().build(new CacheLoader<>() { + @Override + public TextureAtlasSprite load(Block key) { + ResourceLocation registryName = ForgeRegistries.BLOCKS.getKey(key); + var textureLoc = new ResourceLocation(registryName.getNamespace(), "block/" + registryName.getPath()); + var sprite = blockAtlas.getSprite(textureLoc); + // for stuff like azalea bush, retry to get the top texture + if (sprite.contents().name() == MissingTextureAtlasSprite.getLocation()) { + textureLoc = new ResourceLocation(registryName.getNamespace(), "block/" + registryName.getPath() + "_top"); + sprite = blockAtlas.getSprite(textureLoc); + } + return sprite; + } + }); + } + + public static void reload() { + invalidateCaches(); + blockAtlas = Minecraft.getInstance().getModelManager().getAtlas(InventoryMenu.BLOCK_ATLAS); + } + + public static void invalidateCaches() { + SieveRenderer.MESH_TEXTURES.invalidateAll(); + blockAtlas = null; + } + + // uses a RGB color instead of three color components + public static void renderFlatSpriteLerp(VertexConsumer builder, PoseStack stack, float percentage, int color, TextureAtlasSprite sprite, int light, float edge, float yMin, float yMax) { + renderFlatSpriteLerp(builder, stack, percentage, (color >> 16) & 0xff, (color >> 8) & 0xff, (color >> 0) & 0xff, sprite, light, edge, yMin, yMax); + } + + // Renders a sprite inside the barrel with the height determined by how full the barrel is. + public static void renderFlatSpriteLerp(VertexConsumer builder, PoseStack stack, float percentage, int r, int g, int b, TextureAtlasSprite sprite, int light, float edge, float yMin, float yMax) { + float y = Mth.lerp(percentage, yMin, yMax) / 16f; + + renderFlatSprite(builder, stack, y, r, g, b, sprite, light, edge); + } + + // Renders a sprite (y should be between 0 and 1) + @SuppressWarnings("DuplicatedCode") + public static void renderFlatSprite(VertexConsumer builder, PoseStack stack, float y, int r, int g, int b, TextureAtlasSprite sprite, int light, float edge) { + var pose = stack.last().pose(); + var normal = stack.last().normal().transform(new Vector3f(0, 1, 0)); + + // Position coordinates + float edgeMin = edge / 16.0f; + float edgeMax = (16.0f - edge) / 16.0f; + + // Texture coordinates + float uMin = sprite.getU0(); + float uMax = sprite.getU1(); + float vMin = sprite.getV0(); + float vMax = sprite.getV1(); + + // overlayCoords(0, 10) is NO_OVERLAY (0xA0000) + builder.vertex(pose, edgeMin, y, edgeMin).color(r, g, b, 255).overlayCoords(0, 10).uv(uMin, vMin).uv2(light).normal(normal.x, normal.y, normal.z).endVertex(); + builder.vertex(pose, edgeMin, y, edgeMax).color(r, g, b, 255).overlayCoords(0, 10).uv(uMin, vMax).uv2(light).normal(normal.x, normal.y, normal.z).endVertex(); + builder.vertex(pose, edgeMax, y, edgeMax).color(r, g, b, 255).overlayCoords(0, 10).uv(uMax, vMax).uv2(light).normal(normal.x, normal.y, normal.z).endVertex(); + builder.vertex(pose, edgeMax, y, edgeMin).color(r, g, b, 255).overlayCoords(0, 10).uv(uMax, vMin).uv2(light).normal(normal.x, normal.y, normal.z).endVertex(); + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/client/ter/BarrelRenderer.java b/src/main/java/thedarkcolour/exnihiloreborn/client/ter/BarrelRenderer.java index 806c7cb8..97f9621a 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/client/ter/BarrelRenderer.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/client/ter/BarrelRenderer.java @@ -1,7 +1,6 @@ package thedarkcolour.exnihiloreborn.client.ter; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.MultiBufferSource; @@ -9,7 +8,6 @@ import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.BlockRenderDispatcher; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; -import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import net.minecraft.world.inventory.InventoryMenu; @@ -21,6 +19,7 @@ import net.minecraftforge.common.capabilities.ForgeCapabilities; import thedarkcolour.exnihiloreborn.ExNihiloReborn; import thedarkcolour.exnihiloreborn.blockentity.BarrelBlockEntity; import thedarkcolour.exnihiloreborn.client.ClientHandler; +import thedarkcolour.exnihiloreborn.client.RenderUtil; public class BarrelRenderer implements BlockEntityRenderer { public static final ResourceLocation COMPOST_DIRT_TEXTURE = new ResourceLocation(ExNihiloReborn.ID, "block/compost_dirt"); @@ -79,7 +78,7 @@ public class BarrelRenderer implements BlockEntityRenderer { // Setup rendering var builder = buffers.getBuffer(ItemBlockRenderTypes.getRenderLayer(fluid.defaultFluidState())); - renderContents(builder, stack, fluidStack.getAmount() / 1000.0f, r, g, b, sprite, light, 2.0f, 1.0f, 14.0f); + RenderUtil.renderFlatSpriteLerp(builder, stack, fluidStack.getAmount() / 1000.0f, r, g, b, sprite, light, 2.0f, 1.0f, 14.0f); } }); @@ -107,44 +106,7 @@ public class BarrelRenderer implements BlockEntityRenderer { g = (int) Mth.lerp(compostProgress, g, 169); // default green is b = (int) Mth.lerp(compostProgress, b, 109); // default green is - renderContents(builder, stack, barrel.compost / 1000.0f, r, g, b, sprite, light, 2.0f, 1.0f, 14.0f); + RenderUtil.renderFlatSpriteLerp(builder, stack, barrel.compost / 1000.0f, r, g, b, sprite, light, 2.0f, 1.0f, 14.0f); } } - - public static void renderContents(VertexConsumer builder, PoseStack stack, float percentage, int color, TextureAtlasSprite sprite, int light, float edge, float yMin, float yMax) { - renderContents(builder, stack, percentage, (color >> 16) & 0xff, (color >> 8) & 0xff, (color >> 0) & 0xff, sprite, light, edge, yMin, yMax); - } - - // Renders a sprite inside the barrel with the height determined by how full the barrel is. - public static void renderContents(VertexConsumer builder, PoseStack stack, float percentage, int r, int g, int b, TextureAtlasSprite sprite, int light, float edge, float yMin, float yMax) { - // Height - float height = ((yMax - yMin) / 16.0f) * percentage; - - // Offset by specified number of pixels - stack.pushPose(); - stack.translate(0.0, yMin / 16.0, 0.0); - - putQuad(builder, stack, height, r, g, b, sprite, light, edge); - - stack.popPose(); - } - - // Renders a sprite - private static void putQuad(VertexConsumer builder, PoseStack stack, float quadHeight, int r, int g, int b, TextureAtlasSprite sprite, int light, float edge) { - var pose = stack.last().pose(); - - // Texture coordinates - float uMin = sprite.getU0(); - float uMax = sprite.getU1(); - float vMin = sprite.getV0(); - float vMax = sprite.getV1(); - - float edgeMin = edge / 16.0f; - float edgeMax = (16.0f - edge) / 16.0f; - - builder.vertex(pose, edgeMin, quadHeight, edgeMin).color(r, g, b, 255).uv(uMin, vMin).uv2(light).normal(0.0f, 1.0f, 0.0f).endVertex(); - builder.vertex(pose, edgeMin, quadHeight, edgeMax).color(r, g, b, 255).uv(uMin, vMax).uv2(light).normal(0.0f, 1.0f, 0.0f).endVertex(); - builder.vertex(pose, edgeMax, quadHeight, edgeMax).color(r, g, b, 255).uv(uMax, vMax).uv2(light).normal(0.0f, 1.0f, 0.0f).endVertex(); - builder.vertex(pose, edgeMax, quadHeight, edgeMin).color(r, g, b, 255).uv(uMax, vMin).uv2(light).normal(0.0f, 1.0f, 0.0f).endVertex(); - } } diff --git a/src/main/java/thedarkcolour/exnihiloreborn/client/ter/CrucibleRenderer.java b/src/main/java/thedarkcolour/exnihiloreborn/client/ter/CrucibleRenderer.java index 771eb47c..541896e4 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/client/ter/CrucibleRenderer.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/client/ter/CrucibleRenderer.java @@ -1,54 +1,18 @@ package thedarkcolour.exnihiloreborn.client.ter; -import com.google.common.cache.CacheBuilder; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.VertexConsumer; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.client.renderer.RenderType; -import net.minecraft.client.renderer.blockentity.BlockEntityRenderDispatcher; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; -import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; -import net.minecraft.client.renderer.texture.MissingTextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureAtlasSprite; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.inventory.InventoryMenu; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.levelgen.LegacyRandomSource; -import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.extensions.common.IClientFluidTypeExtensions; -import net.minecraftforge.client.model.data.ModelData; import net.minecraftforge.common.capabilities.ForgeCapabilities; -import net.minecraftforge.registries.ForgeRegistries; import thedarkcolour.exnihiloreborn.blockentity.AbstractCrucibleBlockEntity; +import thedarkcolour.exnihiloreborn.client.RenderUtil; public class CrucibleRenderer implements BlockEntityRenderer { - public static final int TEXTURE_CACHE = 10; - public static final LoadingCache TOP_TEXTURES = CacheBuilder.newBuilder().weakValues().maximumSize(30).build(new CacheLoader<>() { - @Override - public TextureAtlasSprite load(Block key) { - ResourceLocation registryName = ForgeRegistries.BLOCKS.getKey(key); - var textureLoc = new ResourceLocation(registryName.getNamespace(), "block/" + registryName.getPath()); - var sprite = Minecraft.getInstance().getTextureAtlas(InventoryMenu.BLOCK_ATLAS).apply(textureLoc); - // for stuff like azalea bush - if (sprite.contents().name() == MissingTextureAtlasSprite.getLocation()) { - textureLoc = new ResourceLocation(registryName.getNamespace(), "block/" + registryName.getPath() + "_top"); - } - return Minecraft.getInstance().getTextureAtlas(InventoryMenu.BLOCK_ATLAS).apply(textureLoc); - } - }); - public static final LoadingCache TOP_RENDER_TYPES = CacheBuilder.newBuilder().maximumSize(10).build(new CacheLoader<>() { - @Override - public RenderType load(Block key) { - var rand = new LegacyRandomSource(key.hashCode()); - var blockTypes = Minecraft.getInstance().getBlockRenderer().getBlockModel(key.defaultBlockState()).getRenderTypes(key.defaultBlockState(), rand, ModelData.EMPTY); - return RenderType.chunkBufferLayers().stream().filter(blockTypes::contains).findFirst().get(); - } - }); - @Override public void render(AbstractCrucibleBlockEntity crucible, float partialTicks, PoseStack stack, MultiBufferSource buffers, int light, int overlay) { crucible.getCapability(ForgeCapabilities.FLUID_HANDLER).ifPresent(tank -> { @@ -68,27 +32,28 @@ public class CrucibleRenderer implements BlockEntityRenderer> 16) & 0xff, 255.0f); @@ -43,7 +44,7 @@ public class InfestedLeavesRenderer implements BlockEntityRenderer { + public static final LoadingCache MESH_TEXTURES = CacheBuilder.newBuilder().build(new CacheLoader<>() { + @Override + public TextureAtlasSprite load(Item key) { + ResourceLocation registryName = ForgeRegistries.ITEMS.getKey(key); + var textureLoc = registryName.withPrefix("item/mesh/"); + return RenderUtil.blockAtlas.getSprite(textureLoc); + } + }); + public SieveRenderer(BlockEntityRendererProvider.Context ctx) {} @Override public void render(SieveBlockEntity sieve, float partialTicks, PoseStack stack, MultiBufferSource buffers, int light, int overlay) { - var contents = sieve.getItem(); + var contents = sieve.getContents(); if (!contents.isEmpty() && contents.getItem() instanceof BlockItem blockItem) { var block = blockItem.getBlock(); var percentage = (float) sieve.getProgress() / 100.0f; - var builder = buffers.getBuffer(CrucibleRenderer.TOP_RENDER_TYPES.getUnchecked(block)); - var sprite = CrucibleRenderer.TOP_TEXTURES.getUnchecked(block); + var builder = buffers.getBuffer(RenderUtil.TOP_RENDER_TYPES.getUnchecked(block)); + var sprite = RenderUtil.TOP_TEXTURES.getUnchecked(block); - BarrelRenderer.renderContents(builder, stack, percentage, 0xffffff, sprite, light, 1.0f, 11.0f, 15.0f); + RenderUtil.renderFlatSpriteLerp(builder, stack, percentage, 0xff, 0xff, 0xff, sprite, light, 1.0f, 13f, 15f); + } + + var mesh = sieve.getMesh(); + + if (!mesh.isEmpty()) { + var builder = buffers.getBuffer(RenderType.cutoutMipped()); + var sprite = MESH_TEXTURES.getUnchecked(mesh.getItem()); + RenderUtil.renderFlatSprite(builder, stack, 0.75f, 0xff, 0xff, 0xff, sprite, light, 1f); + + if (mesh.hasFoil()) { + RenderUtil.renderFlatSprite(buffers.getBuffer(RenderType.glint()), stack, 0.75f, 0xff, 0xff, 0xff, sprite, light, 1f); + } } } } diff --git a/src/main/java/thedarkcolour/exnihiloreborn/compat/jei/BarrelCompostCategory.java b/src/main/java/thedarkcolour/exnihiloreborn/compat/jei/BarrelCompostCategory.java index 62a8c479..8a0cb0f4 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/compat/jei/BarrelCompostCategory.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/compat/jei/BarrelCompostCategory.java @@ -13,30 +13,24 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.Blocks; -import thedarkcolour.exnihiloreborn.block.EBlock; import thedarkcolour.exnihiloreborn.data.TranslationKeys; import thedarkcolour.exnihiloreborn.recipe.barrel.BarrelCompostRecipe; import thedarkcolour.exnihiloreborn.registry.EBlocks; -import java.util.Arrays; - -public class BarrelCompostCategory implements IRecipeCategory { +class BarrelCompostCategory implements IRecipeCategory { public static final int WIDTH = 120; public static final int HEIGHT = 18; private final IDrawable background; private final IDrawable slot; private final IDrawable icon; - private final Component localizedName; + private final Component title; - public BarrelCompostCategory(IJeiHelpers helpers) { - IGuiHelper guiHelpers = helpers.getGuiHelper(); - - this.background = guiHelpers.createBlankDrawable(WIDTH, HEIGHT); - this.slot = guiHelpers.getSlotDrawable(); - this.icon = guiHelpers.createDrawableItemStack(new ItemStack(EBlocks.OAK_BARREL.get())); - this.localizedName = Component.translatable(TranslationKeys.BARREL_COMPOST_CATEGORY_TITLE); + public BarrelCompostCategory(IGuiHelper helper) { + this.background = helper.createBlankDrawable(WIDTH, HEIGHT); + this.slot = helper.getSlotDrawable(); + this.icon = helper.createDrawableItemStack(new ItemStack(EBlocks.OAK_BARREL.get())); + this.title = Component.translatable(TranslationKeys.BARREL_COMPOST_CATEGORY_TITLE); } @Override @@ -46,17 +40,17 @@ public class BarrelCompostCategory implements IRecipeCategory { + public CrucibleCategory(IGuiHelper helper, IDrawable arrow, Supplier iconItem, String titleKey) { + super(helper, arrow, helper.createDrawableItemStack(new ItemStack(iconItem.get())), Component.translatable(titleKey)); + } + + @Override + protected void addInput(IRecipeSlotBuilder slot, CrucibleRecipe recipe) { + slot.addIngredients(recipe.getIngredient()); + } + + @Override + protected void addOutput(IRecipeSlotBuilder slot, CrucibleRecipe recipe) { + slot.addFluidStack(recipe.getResult().getFluid(), recipe.getResult().getAmount()) + .setFluidRenderer(Math.max(1000, recipe.getResult().getAmount()), false, 16, 16); + } + + static class LavaCrucible extends CrucibleCategory { + public LavaCrucible(IGuiHelper helper, IDrawable arrow) { + super(helper, arrow, EItems.PORCELAIN_CRUCIBLE, TranslationKeys.LAVA_CRUCIBLE_CATEGORY_TITLE); + } + + @Override + public RecipeType getRecipeType() { + return ExNihiloRebornJeiPlugin.LAVA_CRUCIBLE; + } + } + + static class WaterCrucible extends CrucibleCategory { + public WaterCrucible(IGuiHelper helper, IDrawable arrow) { + super(helper, arrow, EItems.OAK_CRUCIBLE, TranslationKeys.WATER_CRUCIBLE_CATEGORY_TITLE); + } + + @Override + public RecipeType getRecipeType() { + return ExNihiloRebornJeiPlugin.WATER_CRUCIBLE; + } + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/compat/jei/ExNihiloRebornJeiPlugin.java b/src/main/java/thedarkcolour/exnihiloreborn/compat/jei/ExNihiloRebornJeiPlugin.java index 6ad106ea..e83a727e 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/compat/jei/ExNihiloRebornJeiPlugin.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/compat/jei/ExNihiloRebornJeiPlugin.java @@ -3,6 +3,8 @@ package thedarkcolour.exnihiloreborn.compat.jei; import mezz.jei.api.IModPlugin; import mezz.jei.api.JeiPlugin; import mezz.jei.api.constants.VanillaTypes; +import mezz.jei.api.gui.drawable.IDrawable; +import mezz.jei.api.helpers.IGuiHelper; import mezz.jei.api.recipe.RecipeType; import mezz.jei.api.registration.IRecipeCatalystRegistration; import mezz.jei.api.registration.IRecipeCategoryRegistration; @@ -10,19 +12,32 @@ import mezz.jei.api.registration.IRecipeRegistration; import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.Container; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.Recipe; import thedarkcolour.exnihiloreborn.ExNihiloReborn; import thedarkcolour.exnihiloreborn.data.TranslationKeys; import thedarkcolour.exnihiloreborn.recipe.barrel.BarrelCompostRecipe; +import thedarkcolour.exnihiloreborn.recipe.crucible.CrucibleRecipe; +import thedarkcolour.exnihiloreborn.recipe.hammer.HammerRecipe; +import thedarkcolour.exnihiloreborn.registry.EBlocks; import thedarkcolour.exnihiloreborn.registry.EItems; import thedarkcolour.exnihiloreborn.registry.ERecipeTypes; +import java.util.List; import java.util.Objects; +import java.util.function.Supplier; @JeiPlugin public class ExNihiloRebornJeiPlugin implements IModPlugin { + public static final ResourceLocation ENH_JEI_TEXTURE = new ResourceLocation(ExNihiloReborn.ID, "textures/gui/jei/enr_jei.png"); + public static final RecipeType BARREL_COMPOST = RecipeType.create(ExNihiloReborn.ID, "barrel_compost", BarrelCompostRecipe.class); + public static final RecipeType BARREL_MIXING = RecipeType.create(ExNihiloReborn.ID, "barrel_compost", Object.class); + public static final RecipeType LAVA_CRUCIBLE = RecipeType.create(ExNihiloReborn.ID, "lava_crucible", CrucibleRecipe.class); + public static final RecipeType WATER_CRUCIBLE = RecipeType.create(ExNihiloReborn.ID, "water_crucible", CrucibleRecipe.class); + public static final RecipeType SIEVE = RecipeType.create(ExNihiloReborn.ID, "sieve", JeiSieveRecipeGroup.class); + public static final RecipeType HAMMER = RecipeType.create(ExNihiloReborn.ID, "hammer", HammerRecipe.class); @Override public ResourceLocation getPluginUid() { @@ -31,28 +46,84 @@ public class ExNihiloRebornJeiPlugin implements IModPlugin { @Override public void registerCategories(IRecipeCategoryRegistration registration) { - registration.addRecipeCategories(new BarrelCompostCategory(registration.getJeiHelpers())); + IGuiHelper helper = registration.getJeiHelpers().getGuiHelper(); + IDrawable arrow = helper.createDrawable(ExNihiloRebornJeiPlugin.ENH_JEI_TEXTURE, 0, 18, 22, 15); + + registration.addRecipeCategories(new BarrelCompostCategory(helper)); + registration.addRecipeCategories(new CrucibleCategory.LavaCrucible(helper, arrow)); + registration.addRecipeCategories(new CrucibleCategory.WaterCrucible(helper, arrow)); + registration.addRecipeCategories(new SieveCategory(helper)); + registration.addRecipeCategories(new HammerCategory(helper, arrow)); } @Override public void registerRecipeCatalysts(IRecipeCatalystRegistration registration) { - registration.addRecipeCatalyst(new ItemStack(EItems.OAK_BARREL.get()), BARREL_COMPOST); - registration.addRecipeCatalyst(new ItemStack(EItems.SPRUCE_BARREL.get()), BARREL_COMPOST); - registration.addRecipeCatalyst(new ItemStack(EItems.BIRCH_BARREL.get()), BARREL_COMPOST); - registration.addRecipeCatalyst(new ItemStack(EItems.JUNGLE_BARREL.get()), BARREL_COMPOST); - registration.addRecipeCatalyst(new ItemStack(EItems.ACACIA_BARREL.get()), BARREL_COMPOST); - registration.addRecipeCatalyst(new ItemStack(EItems.DARK_OAK_BARREL.get()), BARREL_COMPOST); - registration.addRecipeCatalyst(new ItemStack(EItems.MANGROVE_BARREL.get()), BARREL_COMPOST); - registration.addRecipeCatalyst(new ItemStack(EItems.CHERRY_BARREL.get()), BARREL_COMPOST); - registration.addRecipeCatalyst(new ItemStack(EItems.BAMBOO_BARREL.get()), BARREL_COMPOST); - registration.addRecipeCatalyst(new ItemStack(EItems.CRIMSON_BARREL.get()), BARREL_COMPOST); - registration.addRecipeCatalyst(new ItemStack(EItems.WARPED_BARREL.get()), BARREL_COMPOST); - registration.addRecipeCatalyst(new ItemStack(EItems.STONE_BARREL.get()), BARREL_COMPOST); + var barrels = new ItemStack[]{ + new ItemStack(EItems.OAK_BARREL.get()), + new ItemStack(EItems.SPRUCE_BARREL.get()), + new ItemStack(EItems.BIRCH_BARREL.get()), + new ItemStack(EItems.JUNGLE_BARREL.get()), + new ItemStack(EItems.ACACIA_BARREL.get()), + new ItemStack(EItems.DARK_OAK_BARREL.get()), + new ItemStack(EItems.MANGROVE_BARREL.get()), + new ItemStack(EItems.CHERRY_BARREL.get()), + new ItemStack(EItems.BAMBOO_BARREL.get()), + new ItemStack(EItems.CRIMSON_BARREL.get()), + new ItemStack(EItems.WARPED_BARREL.get()), + new ItemStack(EItems.STONE_BARREL.get()), + }; + for (var barrel : barrels) { + registration.addRecipeCatalyst(barrel, BARREL_COMPOST); + registration.addRecipeCatalyst(barrel, BARREL_MIXING); + } + + registration.addRecipeCatalyst(new ItemStack(EItems.PORCELAIN_CRUCIBLE.get()), LAVA_CRUCIBLE); + registration.addRecipeCatalyst(new ItemStack(EItems.WARPED_CRUCIBLE.get()), LAVA_CRUCIBLE); + registration.addRecipeCatalyst(new ItemStack(EItems.CRIMSON_CRUCIBLE.get()), LAVA_CRUCIBLE); + + registration.addRecipeCatalyst(new ItemStack(EItems.OAK_CRUCIBLE.get()), WATER_CRUCIBLE); + registration.addRecipeCatalyst(new ItemStack(EItems.SPRUCE_CRUCIBLE.get()), WATER_CRUCIBLE); + registration.addRecipeCatalyst(new ItemStack(EItems.BIRCH_CRUCIBLE.get()), WATER_CRUCIBLE); + registration.addRecipeCatalyst(new ItemStack(EItems.JUNGLE_CRUCIBLE.get()), WATER_CRUCIBLE); + registration.addRecipeCatalyst(new ItemStack(EItems.ACACIA_CRUCIBLE.get()), WATER_CRUCIBLE); + registration.addRecipeCatalyst(new ItemStack(EItems.DARK_OAK_CRUCIBLE.get()), WATER_CRUCIBLE); + registration.addRecipeCatalyst(new ItemStack(EItems.MANGROVE_CRUCIBLE.get()), WATER_CRUCIBLE); + registration.addRecipeCatalyst(new ItemStack(EItems.CHERRY_CRUCIBLE.get()), WATER_CRUCIBLE); + registration.addRecipeCatalyst(new ItemStack(EItems.BAMBOO_CRUCIBLE.get()), WATER_CRUCIBLE); + + registration.addRecipeCatalyst(new ItemStack(EItems.OAK_SIEVE.get()), SIEVE); + registration.addRecipeCatalyst(new ItemStack(EItems.SPRUCE_SIEVE.get()), SIEVE); + registration.addRecipeCatalyst(new ItemStack(EItems.BIRCH_SIEVE.get()), SIEVE); + registration.addRecipeCatalyst(new ItemStack(EItems.JUNGLE_SIEVE.get()), SIEVE); + registration.addRecipeCatalyst(new ItemStack(EItems.ACACIA_SIEVE.get()), SIEVE); + registration.addRecipeCatalyst(new ItemStack(EItems.DARK_OAK_SIEVE.get()), SIEVE); + registration.addRecipeCatalyst(new ItemStack(EItems.MANGROVE_SIEVE.get()), SIEVE); + registration.addRecipeCatalyst(new ItemStack(EItems.CHERRY_SIEVE.get()), SIEVE); + registration.addRecipeCatalyst(new ItemStack(EItems.BAMBOO_SIEVE.get()), SIEVE); + registration.addRecipeCatalyst(new ItemStack(EItems.CRIMSON_SIEVE.get()), SIEVE); + registration.addRecipeCatalyst(new ItemStack(EItems.WARPED_SIEVE.get()), SIEVE); + + registration.addRecipeCatalyst(new ItemStack(EItems.WOODEN_HAMMER.get()), HAMMER); + registration.addRecipeCatalyst(new ItemStack(EItems.STONE_HAMMER.get()), HAMMER); + registration.addRecipeCatalyst(new ItemStack(EItems.GOLDEN_HAMMER.get()), HAMMER); + registration.addRecipeCatalyst(new ItemStack(EItems.IRON_HAMMER.get()), HAMMER); + registration.addRecipeCatalyst(new ItemStack(EItems.DIAMOND_HAMMER.get()), HAMMER); + registration.addRecipeCatalyst(new ItemStack(EItems.NETHERITE_HAMMER.get()), HAMMER); } @Override public void registerRecipes(IRecipeRegistration registration) { registration.addIngredientInfo(new ItemStack(EItems.SILK_WORM.get()), VanillaTypes.ITEM_STACK, Component.translatable(TranslationKeys.SILK_WORM_JEI_INFO)); - registration.addRecipes(BARREL_COMPOST, Objects.requireNonNull(Minecraft.getInstance().level).getRecipeManager().getAllRecipesFor(ERecipeTypes.BARREL_COMPOST.get())); + registration.addIngredientInfo(List.of(new ItemStack(EBlocks.OAK_SIEVE.get()), new ItemStack(EBlocks.SPRUCE_SIEVE.get()), new ItemStack(EBlocks.BIRCH_SIEVE.get()), new ItemStack(EBlocks.JUNGLE_SIEVE.get()), new ItemStack(EBlocks.ACACIA_SIEVE.get()), new ItemStack(EBlocks.DARK_OAK_SIEVE.get()), new ItemStack(EBlocks.MANGROVE_SIEVE.get()), new ItemStack(EBlocks.CHERRY_SIEVE.get()), new ItemStack(EBlocks.BAMBOO_SIEVE.get()), new ItemStack(EBlocks.CRIMSON_SIEVE.get()), new ItemStack(EBlocks.WARPED_SIEVE.get())), VanillaTypes.ITEM_STACK, Component.translatable(TranslationKeys.SIEVE_JEI_INFO)); + addRecipes(registration, BARREL_COMPOST, ERecipeTypes.BARREL_COMPOST); + addRecipes(registration, LAVA_CRUCIBLE, ERecipeTypes.LAVA_CRUCIBLE); + addRecipes(registration, WATER_CRUCIBLE, ERecipeTypes.WATER_CRUCIBLE); + addRecipes(registration, HAMMER, ERecipeTypes.HAMMER); + + JeiSieveRecipeGroup.addRecipes(registration, SIEVE); + } + + private static > void addRecipes(IRecipeRegistration registration, RecipeType category, Supplier> type) { + registration.addRecipes(category, Objects.requireNonNull(Minecraft.getInstance().level).getRecipeManager().getAllRecipesFor(type.get())); } } diff --git a/src/main/java/thedarkcolour/exnihiloreborn/compat/jei/HammerCategory.java b/src/main/java/thedarkcolour/exnihiloreborn/compat/jei/HammerCategory.java new file mode 100644 index 00000000..436bca43 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/compat/jei/HammerCategory.java @@ -0,0 +1,33 @@ +package thedarkcolour.exnihiloreborn.compat.jei; + +import mezz.jei.api.gui.builder.IRecipeSlotBuilder; +import mezz.jei.api.gui.drawable.IDrawable; +import mezz.jei.api.helpers.IGuiHelper; +import mezz.jei.api.recipe.RecipeType; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import thedarkcolour.exnihiloreborn.data.TranslationKeys; +import thedarkcolour.exnihiloreborn.recipe.hammer.HammerRecipe; +import thedarkcolour.exnihiloreborn.registry.EItems; + +class HammerCategory extends OneToOneCategory { + public HammerCategory(IGuiHelper helper, IDrawable arrow) { + super(helper, arrow, helper.createDrawableItemStack(new ItemStack(EItems.DIAMOND_HAMMER.get())), Component.translatable(TranslationKeys.HAMMER_CATEGORY_TITLE)); + } + + @Override + public RecipeType getRecipeType() { + return ExNihiloRebornJeiPlugin.HAMMER; + } + + @Override + protected void addInput(IRecipeSlotBuilder slot, HammerRecipe recipe) { + slot.addIngredients(recipe.getIngredient()); + } + + @Override + protected void addOutput(IRecipeSlotBuilder slot, HammerRecipe recipe) { + slot.addItemStack(new ItemStack(recipe.result)); + SieveCategory.addTooltips(slot, recipe.resultAmount); + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/compat/jei/JeiSieveRecipeGroup.java b/src/main/java/thedarkcolour/exnihiloreborn/compat/jei/JeiSieveRecipeGroup.java new file mode 100644 index 00000000..ff2d9396 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/compat/jei/JeiSieveRecipeGroup.java @@ -0,0 +1,104 @@ +package thedarkcolour.exnihiloreborn.compat.jei; + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Multimap; +import mezz.jei.api.recipe.RecipeType; +import mezz.jei.api.registration.IRecipeRegistration; +import net.minecraft.client.Minecraft; +import net.minecraft.util.Mth; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; +import net.minecraft.world.level.storage.loot.providers.number.NumberProvider; +import thedarkcolour.exnihiloreborn.recipe.RecipeUtil; +import thedarkcolour.exnihiloreborn.recipe.sieve.SieveRecipe; +import thedarkcolour.exnihiloreborn.registry.ERecipeTypes; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Objects; + +record JeiSieveRecipeGroup(Ingredient ingredient, ItemStack mesh, List results) { + public static int maxSieveRows; + + public static void addRecipes(IRecipeRegistration registration, RecipeType recipeType) { + maxSieveRows = 1; + + // copy the list so we can do removals + List recipes = new ArrayList<>(Objects.requireNonNull(Minecraft.getInstance().level).getRecipeManager().getAllRecipesFor(ERecipeTypes.SIEVE.get())); + Multimap ingredientGrouper = ArrayListMultimap.create(); + + for (int i = 0; i < recipes.size(); i++) { + var recipe = recipes.get(i); + + ingredientGrouper.put(recipe.getIngredient(), recipe); + + for (int j = i + 1; j < recipes.size(); j++) { + var other = recipes.get(j); + + if (RecipeUtil.areIngredientsEqual(recipe.getIngredient(), other.getIngredient())) { + ingredientGrouper.put(recipe.getIngredient(), other); + recipes.remove(other); + j--; + } + } + } + + ImmutableList.Builder jeiRecipes = new ImmutableList.Builder<>(); + // Sort based on expected count of result + var sorter = Comparator.comparingDouble(Result::expectedCount).reversed(); + + // ingredients with common ingredients are grouped into lists (ex. dirt) + for (var ingredient : ingredientGrouper.keySet()) { + Multimap meshGrouper = ArrayListMultimap.create(); + var values = ingredientGrouper.get(ingredient); + + // these lists are grouped into sub lists based on their meshes (ex. dirt with string mesh) + for (var recipe : values) { + meshGrouper.put(recipe.mesh, recipe); + } + + // the sub lists have their results combined for displaying in JEI + for (var mesh : meshGrouper.keySet()) { + var meshRecipes = meshGrouper.get(mesh); + var results = new ArrayList(meshRecipes.size()); + + for (var recipe : meshRecipes) { + int resultCount = recipe.resultAmount instanceof ConstantValue constant ? Math.round(constant.value) : 1; + results.add(new Result(new ItemStack(recipe.result, resultCount), recipe.resultAmount)); + } + + results.sort(sorter); + + var jeiRecipe = new JeiSieveRecipeGroup(ingredient, new ItemStack(mesh), results); + jeiRecipes.add(jeiRecipe); + + var rows = Mth.ceil((float) meshRecipes.size() / 9f); + if (rows > maxSieveRows) { + maxSieveRows = rows; + } + } + } + + registration.addRecipes(recipeType, jeiRecipes.build()); + } + + static final class Result { + final ItemStack item; + final NumberProvider provider; + final double expectedCount; + + Result(ItemStack item, NumberProvider provider) { + this.item = item; + this.provider = provider; + this.expectedCount = RecipeUtil.getExpectedValue(this.provider); + } + + public double expectedCount() { + return this.expectedCount; + } + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/compat/jei/OneToOneCategory.java b/src/main/java/thedarkcolour/exnihiloreborn/compat/jei/OneToOneCategory.java new file mode 100644 index 00000000..84593b77 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/compat/jei/OneToOneCategory.java @@ -0,0 +1,62 @@ +package thedarkcolour.exnihiloreborn.compat.jei; + +import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; +import mezz.jei.api.gui.builder.IRecipeSlotBuilder; +import mezz.jei.api.gui.drawable.IDrawable; +import mezz.jei.api.gui.ingredient.IRecipeSlotsView; +import mezz.jei.api.helpers.IGuiHelper; +import mezz.jei.api.recipe.IFocusGroup; +import mezz.jei.api.recipe.RecipeIngredientRole; +import mezz.jei.api.recipe.category.IRecipeCategory; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; + +abstract class OneToOneCategory implements IRecipeCategory { + public static final int WIDTH = 72; + public static final int HEIGHT = 18; + + private final IDrawable background; + private final IDrawable arrow; + private final IDrawable icon; + private final IDrawable slot; + private final Component title; + + public OneToOneCategory(IGuiHelper helper, IDrawable arrow, IDrawable icon, Component title) { + this.background = helper.createBlankDrawable(WIDTH, HEIGHT); + this.arrow = arrow; + this.icon = icon; + this.slot = helper.getSlotDrawable(); + this.title = title; + } + + protected abstract void addInput(IRecipeSlotBuilder slot, T recipe); + protected abstract void addOutput(IRecipeSlotBuilder slot, T recipe); + + @Override + public Component getTitle() { + return this.title; + } + + @Override + public void setRecipe(IRecipeLayoutBuilder builder, T recipe, IFocusGroup focuses) { + addInput(builder.addSlot(RecipeIngredientRole.INPUT, 1, 1), recipe); + addOutput(builder.addSlot(RecipeIngredientRole.OUTPUT, 55, 1), recipe); + } + + @Override + public IDrawable getBackground() { + return this.background; + } + + @Override + public IDrawable getIcon() { + return this.icon; + } + + @Override + public void draw(T recipe, IRecipeSlotsView recipeSlotsView, GuiGraphics graphics, double mouseX, double mouseY) { + slot.draw(graphics); + arrow.draw(graphics, 25, 1); + slot.draw(graphics, 54, 0); + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/compat/jei/SieveCategory.java b/src/main/java/thedarkcolour/exnihiloreborn/compat/jei/SieveCategory.java new file mode 100644 index 00000000..aa42d606 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/compat/jei/SieveCategory.java @@ -0,0 +1,134 @@ +package thedarkcolour.exnihiloreborn.compat.jei; + +import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; +import mezz.jei.api.gui.builder.IRecipeSlotBuilder; +import mezz.jei.api.gui.drawable.IDrawable; +import mezz.jei.api.gui.ingredient.IRecipeSlotsView; +import mezz.jei.api.helpers.IGuiHelper; +import mezz.jei.api.recipe.IFocusGroup; +import mezz.jei.api.recipe.RecipeIngredientRole; +import mezz.jei.api.recipe.RecipeType; +import mezz.jei.api.recipe.category.IRecipeCategory; +import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.providers.number.BinomialDistributionGenerator; +import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; +import net.minecraft.world.level.storage.loot.providers.number.NumberProvider; +import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; +import net.minecraftforge.common.util.Lazy; +import thedarkcolour.exnihiloreborn.data.TranslationKeys; +import thedarkcolour.exnihiloreborn.recipe.RecipeUtil; +import thedarkcolour.exnihiloreborn.registry.EBlocks; + +import java.text.DecimalFormat; + +class SieveCategory implements IRecipeCategory { + private static final DecimalFormat FORMATTER = new DecimalFormat(); + public static final int WIDTH = 162; + public static final int ROW_START = 28; + + static { + FORMATTER.setMinimumFractionDigits(0); + FORMATTER.setMaximumFractionDigits(3); + } + + private final Lazy background; + private final IDrawable slot; + private final IDrawable row; + private final IDrawable icon; + private final Component title; + + public SieveCategory(IGuiHelper helper) { + this.background = Lazy.of(() -> helper.createBlankDrawable(WIDTH, ROW_START + 18 * JeiSieveRecipeGroup.maxSieveRows)); + this.slot = helper.getSlotDrawable(); + this.row = helper.createDrawable(ExNihiloRebornJeiPlugin.ENH_JEI_TEXTURE, 0, 0, 162, 18); + this.icon = helper.createDrawableItemStack(new ItemStack(EBlocks.OAK_SIEVE.get())); + this.title = Component.translatable(TranslationKeys.SIEVE_CATEGORY_TITLE); + } + + @Override + public RecipeType getRecipeType() { + return ExNihiloRebornJeiPlugin.SIEVE; + } + + @Override + public Component getTitle() { + return this.title; + } + + @Override + public IDrawable getBackground() { + return this.background.get(); + } + + @Override + public IDrawable getIcon() { + return this.icon; + } + + @Override + public void setRecipe(IRecipeLayoutBuilder builder, JeiSieveRecipeGroup recipe, IFocusGroup focuses) { + builder.addSlot(RecipeIngredientRole.INPUT, 59, 1).addIngredients(recipe.ingredient()); + builder.addSlot(RecipeIngredientRole.CATALYST, 87, 1).addItemStack(recipe.mesh()); + + for (int i = 0; i < recipe.results().size(); i++) { + var result = recipe.results().get(i); + var slot = builder.addSlot(RecipeIngredientRole.OUTPUT, 1 + (i % 9) * 18, 1 + ROW_START + 18 * (i / 9)).addItemStack(result.item); + + addTooltips(slot, result.provider); + } + } + + public static void addTooltips(IRecipeSlotBuilder slot, NumberProvider provider) { + if (provider instanceof BinomialDistributionGenerator binomial) { + if (binomial.n instanceof ConstantValue constant && constant.value == 1) { + var chance = FORMATTER.format(RecipeUtil.getExpectedValue(binomial.p) * 100); + slot.addTooltipCallback((slotView, tooltip) -> tooltip.add(Component.translatable(TranslationKeys.SIEVE_RECIPE_CHANCE, chance).withStyle(ChatFormatting.GRAY))); + } else { + addAvgOutput(slot, RecipeUtil.getExpectedValue(provider)); + } + + addMinMaxes(slot, ConstantValue.exactly(0), binomial.n); + } else if (provider.getClass() != ConstantValue.class) { + var val = RecipeUtil.getExpectedValue(provider); + if (val != -1.0) { + addAvgOutput(slot, val); + + if (provider instanceof UniformGenerator uniform) { + addMinMaxes(slot, uniform.min, uniform.max); + } + } + } + } + + private static void addAvgOutput(IRecipeSlotBuilder slot, double avgValue) { + String avgOutput = FORMATTER.format(avgValue); + slot.addTooltipCallback((slotView, tooltip) -> tooltip.add(Component.translatable(TranslationKeys.SIEVE_RECIPE_AVERAGE_OUTPUT, avgOutput).withStyle(ChatFormatting.GRAY))); + } + + // when the player holds shift, they can see the min/max amounts of a drop + private static void addMinMaxes(IRecipeSlotBuilder slot, NumberProvider min, NumberProvider max) { + var minFormatted = FORMATTER.format(RecipeUtil.getExpectedValue(min)); + var maxFormatted = FORMATTER.format(RecipeUtil.getExpectedValue(max)); + + slot.addTooltipCallback((slotView, tooltip) -> { + if (Screen.hasShiftDown()) { + tooltip.add(Component.translatable(TranslationKeys.SIEVE_RECIPE_MIN_OUTPUT, minFormatted).withStyle(ChatFormatting.GRAY)); + tooltip.add(Component.translatable(TranslationKeys.SIEVE_RECIPE_MAX_OUTPUT, maxFormatted).withStyle(ChatFormatting.GRAY)); + } + }); + } + + @Override + public void draw(JeiSieveRecipeGroup recipe, IRecipeSlotsView recipeSlotsView, GuiGraphics graphics, double mouseX, double mouseY) { + slot.draw(graphics, 58, 0); + slot.draw(graphics, 86, 0); + + for (int i = 0; i < JeiSieveRecipeGroup.maxSieveRows; i++) { + row.draw(graphics, 0, 28 + i * 18); + } + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/compat/top/InfestedLeavesInfoProvider.java b/src/main/java/thedarkcolour/exnihiloreborn/compat/top/ExNihiloRebornInfoProvider.java similarity index 92% rename from src/main/java/thedarkcolour/exnihiloreborn/compat/top/InfestedLeavesInfoProvider.java rename to src/main/java/thedarkcolour/exnihiloreborn/compat/top/ExNihiloRebornInfoProvider.java index 13c54fe6..978e9a83 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/compat/top/InfestedLeavesInfoProvider.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/compat/top/ExNihiloRebornInfoProvider.java @@ -16,10 +16,10 @@ import thedarkcolour.exnihiloreborn.blockentity.BarrelBlockEntity; import thedarkcolour.exnihiloreborn.blockentity.InfestedLeavesBlockEntity; import thedarkcolour.exnihiloreborn.registry.EBlocks; -public class InfestedLeavesInfoProvider implements IProbeInfoProvider { +public class ExNihiloRebornInfoProvider implements IProbeInfoProvider { @Override public ResourceLocation getID() { - return new ResourceLocation(ExNihiloReborn.ID, "infested_leaves"); + return new ResourceLocation(ExNihiloReborn.ID, "info_provider"); } @Override @@ -49,8 +49,7 @@ public class InfestedLeavesInfoProvider implements IProbeInfoProvider { info.text(CompoundText.create().style(TextStyleClass.ERROR).text("Burning! ").style(TextStyleClass.WARNING).text(progress / 20 + "s")); } } else if (te instanceof AbstractCrucibleBlockEntity crucible) { - info.tankHandler(crucible.getTank()); - info.text(CompoundText.create().style(TextStyleClass.LABEL).text("Rate: ").style(TextStyleClass.WARNING).text(crucible.getMelt() + "x")); + info.text(CompoundText.create().style(TextStyleClass.LABEL).text("Rate: ").style(TextStyleClass.WARNING).text(crucible.getMeltingRate() + "x")); } } } diff --git a/src/main/java/thedarkcolour/exnihiloreborn/compat/top/TopCompatExNihiloReborn.java b/src/main/java/thedarkcolour/exnihiloreborn/compat/top/TopCompatExNihiloReborn.java index ffb00de3..627b7c4d 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/compat/top/TopCompatExNihiloReborn.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/compat/top/TopCompatExNihiloReborn.java @@ -7,7 +7,7 @@ import java.util.function.Function; public class TopCompatExNihiloReborn implements Function { @Override public Void apply(ITheOneProbe top) { - top.registerProvider(new InfestedLeavesInfoProvider()); + top.registerProvider(new ExNihiloRebornInfoProvider()); return null; } diff --git a/src/main/java/thedarkcolour/exnihiloreborn/data/Advancements.java b/src/main/java/thedarkcolour/exnihiloreborn/data/Advancements.java index 44009b8d..091d5f85 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/data/Advancements.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/data/Advancements.java @@ -64,7 +64,7 @@ class Advancements extends ForgeAdvancementProvider { true, false ) - .addCriterion("craft_crook", RecipeCraftedTrigger.TriggerInstance.craftedItem(EItems.CROOK.getId())) + .addCriterion("craft_crook", hasItems(item().of(EItemTags.CROOKS).build())) .save(saver, modLoc("core/crook"), helper); var barrel = advancement() .parent(root) diff --git a/src/main/java/thedarkcolour/exnihiloreborn/data/BlockLoot.java b/src/main/java/thedarkcolour/exnihiloreborn/data/BlockLoot.java index b7f1b782..49861750 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/data/BlockLoot.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/data/BlockLoot.java @@ -1,5 +1,6 @@ package thedarkcolour.exnihiloreborn.data; +import net.minecraft.core.registries.Registries; import net.minecraft.data.loot.BlockLootSubProvider; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.flag.FeatureFlagSet; @@ -10,8 +11,11 @@ import net.minecraft.world.level.storage.loot.LootPool; import net.minecraft.world.level.storage.loot.LootTable; import net.minecraft.world.level.storage.loot.entries.LootItem; import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; +import net.minecraftforge.registries.ForgeRegistries; +import thedarkcolour.exnihiloreborn.ExNihiloReborn; import thedarkcolour.exnihiloreborn.loot.InfestedStringCount; import thedarkcolour.exnihiloreborn.registry.EBlocks; +import thedarkcolour.modkit.MKUtils; import java.util.ArrayList; import java.util.List; @@ -27,35 +31,12 @@ class BlockLoot extends BlockLootSubProvider { @Override protected void generate() { + MKUtils.forModRegistry(Registries.BLOCK, ExNihiloReborn.ID, (id, block) -> dropSelf(block)); + add(EBlocks.INFESTED_LEAVES.get(), new LootTable.Builder() .withPool(new LootPool.Builder() .setRolls(ConstantValue.exactly(1)) .add(LootItem.lootTableItem(Items.STRING).apply(InfestedStringCount.infestedString())))); - - addSelfDrops(); - } - - private void dropSelf(Supplier item) { - this.dropSelf(item.get()); - } - - private void addSelfDrops() { - dropSelf(EBlocks.DUST); - - dropSelf(EBlocks.COMPRESSED_COBBLESTONE); - dropSelf(EBlocks.COMPRESSED_DIRT); - dropSelf(EBlocks.COMPRESSED_SAND); - dropSelf(EBlocks.COMPRESSED_DUST); - - dropSelf(EBlocks.OAK_BARREL); - dropSelf(EBlocks.SPRUCE_BARREL); - dropSelf(EBlocks.BIRCH_BARREL); - dropSelf(EBlocks.JUNGLE_BARREL); - dropSelf(EBlocks.ACACIA_BARREL); - dropSelf(EBlocks.DARK_OAK_BARREL); - dropSelf(EBlocks.CRIMSON_BARREL); - dropSelf(EBlocks.WARPED_BARREL); - dropSelf(EBlocks.STONE_BARREL); } @Override diff --git a/src/main/java/thedarkcolour/exnihiloreborn/data/BlockTags.java b/src/main/java/thedarkcolour/exnihiloreborn/data/BlockTags.java deleted file mode 100644 index 954ca1f2..00000000 --- a/src/main/java/thedarkcolour/exnihiloreborn/data/BlockTags.java +++ /dev/null @@ -1,20 +0,0 @@ -package thedarkcolour.exnihiloreborn.data; - -import net.minecraft.core.HolderLookup; -import net.minecraft.data.PackOutput; -import net.minecraftforge.common.data.BlockTagsProvider; -import net.minecraftforge.common.data.ExistingFileHelper; -import thedarkcolour.exnihiloreborn.ExNihiloReborn; - -import javax.annotation.Nullable; -import java.util.concurrent.CompletableFuture; - -class BlockTags extends BlockTagsProvider { - public BlockTags(PackOutput output, CompletableFuture lookup, @Nullable ExistingFileHelper helper) { - super(output, lookup, ExNihiloReborn.ID, helper); - } - - @Override - protected void addTags(HolderLookup.Provider lookup) { - } -} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/data/Data.java b/src/main/java/thedarkcolour/exnihiloreborn/data/Data.java index cc0732c0..2474226d 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/data/Data.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/data/Data.java @@ -1,7 +1,5 @@ package thedarkcolour.exnihiloreborn.data; -import net.minecraft.core.RegistryAccess; -import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; import net.minecraftforge.data.event.GatherDataEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -9,7 +7,7 @@ import net.minecraftforge.fml.common.Mod; import thedarkcolour.exnihiloreborn.ExNihiloReborn; import thedarkcolour.modkit.data.DataHelper; -// these two annotations basically mean modEventBus.addListener(Data::generateData) +// these two annotations are equivalent to modEventBus.addListener(Data::generateData) @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) public class Data { @SubscribeEvent @@ -18,7 +16,8 @@ public class Data { var gen = event.getGenerator(); // writes to json var output = gen.getPackOutput(); var lookup = event.getLookupProvider(); - var helper = event.getExistingFileHelper(); // reads existing files like pngs and parent models + // reads existing files like pngs and parent models + var helper = event.getExistingFileHelper(); var dataHelper = new DataHelper(ExNihiloReborn.ID, event); dataHelper.createEnglish(true, English::addTranslations); @@ -26,14 +25,13 @@ public class Data { dataHelper.createItemModels(true, true, false, ItemModels::addItemModels); dataHelper.createRecipes(Recipes::addRecipes); - - var blockTags = new BlockTags(output, lookup, helper); + dataHelper.createTags(Registries.BLOCK, ModTags::createBlockTags); + dataHelper.createTags(Registries.ITEM, ModTags::createItemTags); + dataHelper.createTags(Registries.FLUID, ModTags::createFluidTags); + dataHelper.createTags(Registries.STRUCTURE_SET, ModTags::createStructureSetTags); + dataHelper.createTags(Registries.WORLD_PRESET, ModTags::createWorldPresetTags); gen.addProvider(true, new LootTables(output)); - gen.addProvider(true, blockTags); - gen.addProvider(true, new ItemTags(output, lookup, blockTags.contentsGetter(), helper)); - gen.addProvider(true, new StructureTags(output, lookup, helper)); - gen.addProvider(true, new WorldPresetTags(output, lookup, helper)); gen.addProvider(true, new Advancements(output, lookup, helper)); } } diff --git a/src/main/java/thedarkcolour/exnihiloreborn/data/English.java b/src/main/java/thedarkcolour/exnihiloreborn/data/English.java index 6589157b..05d718de 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/data/English.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/data/English.java @@ -1,15 +1,18 @@ package thedarkcolour.exnihiloreborn.data; +import thedarkcolour.exnihiloreborn.ExNihiloReborn; import thedarkcolour.modkit.data.MKEnglishProvider; class English { static void addTranslations(MKEnglishProvider english) { + english.add("fluid_type." + ExNihiloReborn.ID + ".witch_water", "Witch Water"); + english.add(TranslationKeys.MAIN_CREATIVE_TAB, "Ex Nihilo Reborn"); english.add(TranslationKeys.VOID_WORLD_TYPE, "Void World"); english.add(TranslationKeys.ROOT_ADVANCEMENT_TITLE, "Don't Look Down..."); english.add(TranslationKeys.ROOT_ADVANCEMENT_DESCRIPTION, "Spawn into a SkyBlock void world"); - english.add(TranslationKeys.CROOK_ADVANCEMENT_TITLE, "This is a Robbery"); + english.add(TranslationKeys.CROOK_ADVANCEMENT_TITLE, "Give Him The Hook"); english.add(TranslationKeys.CROOK_ADVANCEMENT_DESCRIPTION, "Craft a Crook to double sapling drops from leaves"); english.add(TranslationKeys.BARREL_ADVANCEMENT_TITLE, "That Goes in the GreenWaste"); english.add(TranslationKeys.BARREL_ADVANCEMENT_DESCRIPTION, "Use a barrel to compost organic material into dirt"); @@ -19,13 +22,16 @@ class English { english.add(TranslationKeys.STRING_MESH_ADVANCEMENT_DESCRIPTION, "Craft a string mesh to use in a sieve"); english.add(TranslationKeys.SILK_WORM_JEI_INFO, "Silk worms have a 1 in 100 chance to drop from leaves harvested with a Crook. Using a silk worm on a tree's leaves will infest them, gradually spreading through the entire tree. 100% infested leaves can be harvested for string, but do not drop saplings."); + english.add(TranslationKeys.SIEVE_JEI_INFO, "Sieves are used to filter out certain items from soft blocks like gravel and dirt. A mesh is required to use the sieve, and it can be enchanted with Fortune and Efficiency."); english.add(TranslationKeys.BARREL_COMPOST_CATEGORY_TITLE, "Barrel Compost"); english.add(TranslationKeys.BARREL_COMPOST_RECIPE_VOLUME, "Compost: %s"); english.add(TranslationKeys.WATER_CRUCIBLE_CATEGORY_TITLE, "Water Crucible"); english.add(TranslationKeys.LAVA_CRUCIBLE_CATEGORY_TITLE, "Lava Crucible"); - english.add(TranslationKeys.HAMMER_CATEGORY_TITLE, "Hammer Crucible"); - english.add(TranslationKeys.COMPRESSED_HAMMER_CATEGORY_TITLE, "Compressed Hammer"); + english.add(TranslationKeys.HAMMER_CATEGORY_TITLE, "Hammer"); english.add(TranslationKeys.SIEVE_CATEGORY_TITLE, "Sieve"); - english.add(TranslationKeys.COMPRESSED_SIEVE_CATEGORY_TITLE, "Heavy Sieve"); + english.add(TranslationKeys.SIEVE_RECIPE_CHANCE, "Chance: %s%%"); + english.add(TranslationKeys.SIEVE_RECIPE_AVERAGE_OUTPUT, "Avg. Output: %s"); + english.add(TranslationKeys.SIEVE_RECIPE_MIN_OUTPUT, "Min: %s"); + english.add(TranslationKeys.SIEVE_RECIPE_MAX_OUTPUT, "Max: %s"); } } diff --git a/src/main/java/thedarkcolour/exnihiloreborn/data/FluidTags.java b/src/main/java/thedarkcolour/exnihiloreborn/data/FluidTags.java deleted file mode 100644 index 63e9f3f3..00000000 --- a/src/main/java/thedarkcolour/exnihiloreborn/data/FluidTags.java +++ /dev/null @@ -1,4 +0,0 @@ -package thedarkcolour.exnihiloreborn.data; - -public class FluidTags { -} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/data/ItemTags.java b/src/main/java/thedarkcolour/exnihiloreborn/data/ItemTags.java deleted file mode 100644 index 316fff57..00000000 --- a/src/main/java/thedarkcolour/exnihiloreborn/data/ItemTags.java +++ /dev/null @@ -1,29 +0,0 @@ -package thedarkcolour.exnihiloreborn.data; - -import net.minecraft.core.HolderLookup; -import net.minecraft.data.PackOutput; -import net.minecraft.data.tags.ItemTagsProvider; -import net.minecraft.world.level.block.Block; -import net.minecraftforge.common.data.ExistingFileHelper; -import org.jetbrains.annotations.Nullable; -import thedarkcolour.exnihiloreborn.ExNihiloReborn; -import thedarkcolour.exnihiloreborn.tag.EItemTags; -import thedarkcolour.exnihiloreborn.registry.EItems; - -import java.util.concurrent.CompletableFuture; - -class ItemTags extends ItemTagsProvider { - public ItemTags(PackOutput output, CompletableFuture lookupProvider, CompletableFuture> blockTags, @Nullable ExistingFileHelper existingFileHelper) { - super(output, lookupProvider, blockTags, ExNihiloReborn.ID, existingFileHelper); - } - - @SuppressWarnings("unchecked") - @Override - protected void addTags(HolderLookup.Provider lookup) { - tag(EItemTags.HAMMERS).add(EItems.WOODEN_HAMMER.get(), EItems.STONE_HAMMER.get(), EItems.GOLDEN_HAMMER.get(), EItems.IRON_HAMMER.get(), EItems.DIAMOND_HAMMER.get(), EItems.NETHERITE_HAMMER.get()); - tag(EItemTags.CROOKS).add(EItems.CROOK.get(), EItems.BONE_CROOK.get()); - tag(EItemTags.WOODEN_BARRELS).add(EItems.OAK_BARREL.get(), EItems.SPRUCE_BARREL.get(), EItems.BIRCH_BARREL.get(), EItems.JUNGLE_BARREL.get(), EItems.ACACIA_BARREL.get(), EItems.DARK_OAK_BARREL.get(), EItems.MANGROVE_BARREL.get(), EItems.CHERRY_BARREL.get(), EItems.BAMBOO_BARREL.get()); - tag(EItemTags.STONE_BARRELS).add(EItems.STONE_BARREL.get()); - tag(EItemTags.BARRELS).addTags(EItemTags.WOODEN_BARRELS, EItemTags.STONE_BARRELS); - } -} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/data/ModTags.java b/src/main/java/thedarkcolour/exnihiloreborn/data/ModTags.java new file mode 100644 index 00000000..daf8adef --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/data/ModTags.java @@ -0,0 +1,51 @@ +package thedarkcolour.exnihiloreborn.data; + +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.FluidTags; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.levelgen.presets.WorldPreset; +import net.minecraft.world.level.levelgen.structure.BuiltinStructureSets; +import net.minecraft.world.level.levelgen.structure.StructureSet; +import net.minecraft.world.level.material.Fluid; +import thedarkcolour.exnihiloreborn.ExNihiloReborn; +import thedarkcolour.exnihiloreborn.registry.EBlocks; +import thedarkcolour.exnihiloreborn.registry.EFluids; +import thedarkcolour.exnihiloreborn.registry.EItems; +import thedarkcolour.exnihiloreborn.tag.EItemTags; +import thedarkcolour.exnihiloreborn.tag.EStructureSetTags; +import thedarkcolour.modkit.data.MKTagsProvider; + +class ModTags { + public static void createBlockTags(MKTagsProvider tags) { + tags.tag(BlockTags.MINEABLE_WITH_AXE).add(EBlocks.OAK_BARREL.get(), EBlocks.SPRUCE_BARREL.get(), EBlocks.BIRCH_BARREL.get(), EBlocks.JUNGLE_BARREL.get(), EBlocks.ACACIA_BARREL.get(), EBlocks.DARK_OAK_BARREL.get(), EBlocks.MANGROVE_BARREL.get(), EBlocks.CHERRY_BARREL.get(), EBlocks.BAMBOO_BARREL.get(), EBlocks.CRIMSON_BARREL.get(), EBlocks.WARPED_BARREL.get(), EBlocks.OAK_SIEVE.get(), EBlocks.SPRUCE_SIEVE.get(), EBlocks.BIRCH_SIEVE.get(), EBlocks.JUNGLE_SIEVE.get(), EBlocks.ACACIA_SIEVE.get(), EBlocks.DARK_OAK_SIEVE.get(), EBlocks.MANGROVE_SIEVE.get(), EBlocks.CHERRY_SIEVE.get(), EBlocks.BAMBOO_SIEVE.get(), EBlocks.CRIMSON_SIEVE.get(), EBlocks.WARPED_SIEVE.get(), EBlocks.WARPED_CRUCIBLE.get(), EBlocks.CRIMSON_CRUCIBLE.get(), EBlocks.OAK_CRUCIBLE.get(), EBlocks.SPRUCE_CRUCIBLE.get(), EBlocks.BIRCH_CRUCIBLE.get(), EBlocks.JUNGLE_CRUCIBLE.get(), EBlocks.ACACIA_CRUCIBLE.get(), EBlocks.DARK_OAK_CRUCIBLE.get(), EBlocks.MANGROVE_CRUCIBLE.get(), EBlocks.CHERRY_CRUCIBLE.get(), EBlocks.BAMBOO_CRUCIBLE.get()); + tags.tag(BlockTags.MINEABLE_WITH_PICKAXE).add(EBlocks.STONE_BARREL.get(), EBlocks.PORCELAIN_CRUCIBLE.get(), EBlocks.UNFIRED_CRUCIBLE.get()); + } + + public static void createItemTags(MKTagsProvider tags) { + tags.tag(EItemTags.HAMMERS).add(EItems.WOODEN_HAMMER, EItems.STONE_HAMMER, EItems.GOLDEN_HAMMER, EItems.IRON_HAMMER, EItems.DIAMOND_HAMMER, EItems.NETHERITE_HAMMER); + tags.tag(EItemTags.CROOKS).add(EItems.CROOK, EItems.BONE_CROOK); + tags.tag(EItemTags.SIEVE_MESHES).add(EItems.STRING_MESH, EItems.FLINT_MESH, EItems.IRON_MESH, EItems.GOLDEN_MESH, EItems.DIAMOND_MESH, EItems.NETHERITE_MESH); + tags.tag(EItemTags.PEBBLES).add(EItems.STONE_PEBBLE, EItems.DIORITE_PEBBLE, EItems.GRANITE_PEBBLE, EItems.ANDESITE_PEBBLE, EItems.DEEPSLATE_PEBBLE, EItems.TUFF_PEBBLE); + tags.tag(EItemTags.WOODEN_BARRELS).add(EItems.OAK_BARREL.get(), EItems.SPRUCE_BARREL.get(), EItems.BIRCH_BARREL.get(), EItems.JUNGLE_BARREL.get(), EItems.ACACIA_BARREL.get(), EItems.DARK_OAK_BARREL.get(), EItems.MANGROVE_BARREL.get(), EItems.CHERRY_BARREL.get(), EItems.BAMBOO_BARREL.get()); + tags.tag(EItemTags.STONE_BARRELS).add(EItems.STONE_BARREL.get()); + tags.tag(EItemTags.BARRELS).addTags(EItemTags.WOODEN_BARRELS, EItemTags.STONE_BARRELS); + } + + public static void createStructureSetTags(MKTagsProvider tags) { + tags.tag(EStructureSetTags.OVERWORLD_VOID_STRUCTURES); + tags.tag(EStructureSetTags.THE_NETHER_VOID_STRUCTURES).add(BuiltinStructureSets.NETHER_COMPLEXES); + tags.tag(EStructureSetTags.THE_END_VOID_STRUCTURES).add(BuiltinStructureSets.END_CITIES); + } + + public static void createWorldPresetTags(MKTagsProvider tags) { + tags.tag(net.minecraft.tags.WorldPresetTags.NORMAL).add(ResourceKey.create(Registries.WORLD_PRESET, new ResourceLocation(ExNihiloReborn.ID, "void_world"))); + } + + public static void createFluidTags(MKTagsProvider tags) { + tags.tag(FluidTags.WATER).add(EFluids.WITCH_WATER_STILL.get(), EFluids.WITCH_WATER_FLOWING.get()); + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/data/Recipes.java b/src/main/java/thedarkcolour/exnihiloreborn/data/Recipes.java index 10299c5c..02bb4a96 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/data/Recipes.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/data/Recipes.java @@ -1,46 +1,56 @@ package thedarkcolour.exnihiloreborn.data; -import com.google.common.collect.ImmutableList; import net.minecraft.data.recipes.FinishedRecipe; import net.minecraft.data.recipes.RecipeBuilder; import net.minecraft.data.recipes.RecipeCategory; 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.crafting.Ingredient; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.material.Fluids; +import net.minecraft.world.level.storage.loot.providers.number.BinomialDistributionGenerator; +import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; +import net.minecraft.world.level.storage.loot.providers.number.NumberProvider; +import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; +import net.minecraftforge.common.ForgeMod; import net.minecraftforge.common.Tags; +import net.minecraftforge.fluids.FluidType; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; import thedarkcolour.exnihiloreborn.ExNihiloReborn; -import thedarkcolour.exnihiloreborn.recipe.Reward; import thedarkcolour.exnihiloreborn.recipe.barrel.FinishedBarrelCompostRecipe; +import thedarkcolour.exnihiloreborn.recipe.barrel.FinishedBarrelMixingRecipe; import thedarkcolour.exnihiloreborn.recipe.crucible.FinishedCrucibleRecipe; import thedarkcolour.exnihiloreborn.recipe.hammer.FinishedHammerRecipe; import thedarkcolour.exnihiloreborn.recipe.sieve.FinishedSieveRecipe; import thedarkcolour.exnihiloreborn.registry.EBlocks; +import thedarkcolour.exnihiloreborn.registry.EFluids; import thedarkcolour.exnihiloreborn.registry.EItems; import thedarkcolour.exnihiloreborn.registry.ERecipeSerializers; import thedarkcolour.modkit.data.MKRecipeProvider; +import java.util.Objects; +import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Supplier; import static net.minecraft.data.recipes.SimpleCookingRecipeBuilder.*; import static net.minecraft.data.recipes.SmithingTransformRecipeBuilder.smithing; +import static net.minecraft.world.level.storage.loot.providers.number.BinomialDistributionGenerator.binomial; +import static thedarkcolour.modkit.data.MKRecipeProvider.unlockedByHaving; class Recipes { public static void addRecipes(Consumer writer, MKRecipeProvider recipes) { craftingRecipes(writer, recipes); - smeltingRecipes(writer, recipes); - sieveRecipes(writer, recipes); + smeltingRecipes(writer); + sieveRecipes(writer); crucibleRecipes(writer); hammerRecipes(writer); barrelCompostRecipes(writer); + barrelMixingRecipes(writer); } private static void craftingRecipes(Consumer writer, MKRecipeProvider recipes) { @@ -54,7 +64,7 @@ class Recipes { shapedHammer(recipes, EItems.GOLDEN_HAMMER, Ingredient.of(Tags.Items.INGOTS_GOLD)); shapedHammer(recipes, EItems.IRON_HAMMER, Ingredient.of(Tags.Items.INGOTS_IRON)); shapedHammer(recipes, EItems.DIAMOND_HAMMER, Ingredient.of(Tags.Items.GEMS_DIAMOND)); - MKRecipeProvider.unlockedByHaving(smithing( + unlockedByHaving(smithing( Ingredient.of(Items.NETHERITE_UPGRADE_SMITHING_TEMPLATE), Ingredient.of(EItems.DIAMOND_HAMMER.get()), Ingredient.of(Tags.Items.INGOTS_NETHERITE), @@ -91,6 +101,20 @@ class Recipes { uShaped(recipes, EItems.CRIMSON_BARREL, Ingredient.of(Items.CRIMSON_PLANKS), Ingredient.of(Items.CRIMSON_SLAB)); uShaped(recipes, EItems.WARPED_BARREL, Ingredient.of(Items.WARPED_PLANKS), Ingredient.of(Items.WARPED_SLAB)); uShaped(recipes, EItems.STONE_BARREL, Ingredient.of(Items.STONE), Ingredient.of(Items.STONE_SLAB)); + + twoByTwo(recipes, Items.COBBLESTONE, Ingredient.of(EItems.STONE_PEBBLE.get())); + twoByTwo(recipes, Items.ANDESITE, Ingredient.of(EItems.ANDESITE_PEBBLE.get())); + twoByTwo(recipes, Items.DIORITE, Ingredient.of(EItems.DIORITE_PEBBLE.get())); + twoByTwo(recipes, Items.GRANITE, Ingredient.of(EItems.GRANITE_PEBBLE.get())); + twoByTwo(recipes, Items.IRON_ORE, Ingredient.of(EItems.IRON_ORE_CHUNK.get())); + twoByTwo(recipes, Items.GOLD_ORE, Ingredient.of(EItems.GOLD_ORE_CHUNK.get())); + twoByTwo(recipes, Items.COPPER_ORE, Ingredient.of(EItems.COPPER_ORE_CHUNK.get())); + recipes.shapedCrafting(RecipeCategory.MISC, EItems.STRING_MESH.get(), recipe -> { + recipe.define('s', Tags.Items.STRING); + recipe.pattern("sss"); + recipe.pattern("sss"); + recipe.pattern("sss"); + }); } private static void shapedCrook(MKRecipeProvider recipes, RegistryObject crook, Ingredient stick) { @@ -122,40 +146,72 @@ class Recipes { }); } + private static void twoByTwo(MKRecipeProvider recipes, Item result, Ingredient ingredient) { + recipes.shapedCrafting(RecipeCategory.MISC, result, recipe -> { + recipe.define('#', ingredient); + recipe.pattern("##"); + recipe.pattern("##"); + }); + } + // todo add support in modkit - private static void smeltingRecipes(Consumer writer, MKRecipeProvider recipes) { - MKRecipeProvider.unlockedByHaving( + private static void smeltingRecipes(Consumer writer) { + unlockedByHaving( smelting(Ingredient.of(EItems.UNFIRED_CRUCIBLE.get()), RecipeCategory.MISC, EItems.PORCELAIN_CRUCIBLE.get(), 0.1f, 200), EItems.UNFIRED_CRUCIBLE.get() ).save(writer, EItems.PORCELAIN_CRUCIBLE.getId()); - MKRecipeProvider.unlockedByHaving( + unlockedByHaving( smelting(Ingredient.of(EItems.SILK_WORM.get()), RecipeCategory.FOOD, EItems.COOKED_SILK_WORM.get(), 0.1f, 200), EItems.SILK_WORM.get() ).save(writer, EItems.COOKED_SILK_WORM.getId()); - MKRecipeProvider.unlockedByHaving( + unlockedByHaving( smoking(Ingredient.of(EItems.SILK_WORM.get()), RecipeCategory.FOOD, EItems.COOKED_SILK_WORM.get(), 0.1f, 100), EItems.SILK_WORM.get() ).save(writer, EItems.COOKED_SILK_WORM.getId().withSuffix("_from_smoking")); - MKRecipeProvider.unlockedByHaving( + unlockedByHaving( campfireCooking(Ingredient.of(EItems.SILK_WORM.get()), RecipeCategory.FOOD, EItems.COOKED_SILK_WORM.get(), 0.1f, 600), EItems.SILK_WORM.get() ).save(writer, EItems.PORCELAIN_CRUCIBLE.getId().withSuffix("_from_campfire_cooking")); } - private static void sieveRecipes(Consumer writer, MKRecipeProvider recipes) { - sieveRecipe(writer, "stone_pebble", Ingredient.of(Items.DIRT), EItems.STRING_MESH, Reward.withExtraChances(EItems.STONE_PEBBLE, new float[] {1.0f, 1.0f, 0.5f, 0.5f, 0.1f, 0.1f })); - sieveRecipe(writer, "wheat_seeds", Ingredient.of(Items.DIRT), EItems.STRING_MESH, Reward.of(Items.WHEAT_SEEDS, 0.7f)); - sieveRecipe(writer, "beetroot_seeds", Ingredient.of(Items.DIRT), EItems.STRING_MESH, Reward.of(Items.BEETROOT_SEEDS, 0.35f)); - sieveRecipe(writer, "melon_seeds", Ingredient.of(Items.DIRT), EItems.STRING_MESH, Reward.of(Items.MELON_SEEDS, 0.35f)); - sieveRecipe(writer, "pumpkin_seeds", Ingredient.of(Items.DIRT), EItems.STRING_MESH, Reward.of(Items.PUMPKIN_SEEDS, 0.35f)); + private static void sieveRecipes(Consumer writer) { + // Dirt -> String mesh + forMesh(writer, Ingredient.of(Items.DIRT), EItems.STRING_MESH, addDrop -> { + addDrop.accept(EItems.STONE_PEBBLE.get(), binomial(7, 0.6f)); + addDrop.accept(Items.WHEAT_SEEDS, chance(0.7f)); + addDrop.accept(Items.BEETROOT_SEEDS, chance(0.35f)); + addDrop.accept(Items.MELON_SEEDS, chance(0.35f)); + addDrop.accept(Items.PUMPKIN_SEEDS, chance(0.35f)); + addDrop.accept(Items.FLINT, chance(0.25f)); + }); + + // Flint mesh will be used to get a larger variety of outputs from dirt, and + // is the lowest mesh tier where ore will start to drop. + // Gravel -> String mesh + forMesh(writer, Ingredient.of(Items.DIRT), EItems.FLINT_MESH, addDrop -> { + addDrop.accept(EItems.STONE_PEBBLE.get(), binomial(7, 0.6f)); + addDrop.accept(EItems.ANDESITE_PEBBLE.get(), binomial(7, 0.4f)); + addDrop.accept(EItems.GRANITE_PEBBLE.get(), binomial(7, 0.4f)); + addDrop.accept(EItems.DIORITE_PEBBLE.get(), binomial(7, 0.4f)); + addDrop.accept(Items.WHEAT_SEEDS, chance(0.5f)); + addDrop.accept(Items.BEETROOT_SEEDS, chance(0.1f)); + addDrop.accept(Items.MELON_SEEDS, chance(0.1f)); + addDrop.accept(Items.PUMPKIN_SEEDS, chance(0.1f)); + addDrop.accept(Items.FLINT, chance(0.2f)); + }); } - private static void sieveRecipe(Consumer consumer, String name, Ingredient block, Supplier mesh, ImmutableList rewards) { - consumer.accept(new FinishedSieveRecipe(ERecipeSerializers.SIEVE.get(), new ResourceLocation(ExNihiloReborn.ID, "sieve/" + name), mesh.get(), block, rewards)); + private static BinomialDistributionGenerator chance(float p) { + return binomial(1, p); } - private static void sieveRecipe(Consumer consumer, String name, Ingredient block, Supplier mesh, Reward rewards) { - consumer.accept(new FinishedSieveRecipe(ERecipeSerializers.SIEVE.get(), new ResourceLocation(ExNihiloReborn.ID, "sieve/" + name), mesh.get(), block, ImmutableList.of(rewards))); + private static void forMesh(Consumer writer, Ingredient block, RegistryObject mesh, Consumer> addDrops) { + var folder = mesh.getId().getPath().replace("_mesh", "/"); + addDrops.accept((result, resultAmount) -> sieveRecipe(writer, folder + path(result), block, mesh, result, resultAmount)); + } + + private static void sieveRecipe(Consumer consumer, String name, Ingredient block, Supplier mesh, Item result, NumberProvider chance) { + consumer.accept(new FinishedSieveRecipe(new ResourceLocation(ExNihiloReborn.ID, "sieve/" + name), mesh.get(), block, result, chance)); } private static void crucibleRecipes(Consumer writer) { @@ -190,31 +246,25 @@ class Recipes { private static void hammerRecipes(Consumer writer) { // Cobblestone -> Gravel -> Sand -> Dust - hammerRecipe(writer, "gravel", Blocks.COBBLESTONE, new Reward(Blocks.GRAVEL)); - hammerRecipe(writer, "sand", Blocks.GRAVEL, new Reward(Blocks.SAND)); - hammerRecipe(writer, "dust", Blocks.SAND, new Reward(EBlocks.DUST.get())); + hammerRecipe(writer, "gravel", Ingredient.of(Items.COBBLESTONE), Blocks.GRAVEL); + hammerRecipe(writer, "sand", Ingredient.of(Items.GRAVEL), Blocks.SAND); + hammerRecipe(writer, "dust", Ingredient.of(Items.SAND), EBlocks.DUST.get()); - hammerRecipe(writer, "crushed_netherrack", Blocks.NETHERRACK, new Reward(EBlocks.CRUSHED_NETHERRACK.get())); + hammerRecipe(writer, "crushed_netherrack", Ingredient.of(Blocks.NETHERRACK), EBlocks.CRUSHED_NETHERRACK.get()); - hammerRecipe(writer, "crushing_sandstone", Ingredient.of(Items.SANDSTONE, Items.CUT_SANDSTONE, Items.CHISELED_SANDSTONE, Items.SMOOTH_SANDSTONE), ImmutableList.of(new Reward(Items.SAND))); - hammerRecipe(writer, "crushing_red_sandstone", Ingredient.of(Items.RED_SANDSTONE, Items.CUT_RED_SANDSTONE, Items.CHISELED_RED_SANDSTONE, Items.SMOOTH_RED_SANDSTONE), ImmutableList.of(new Reward(Items.RED_SAND))); - hammerRecipe(writer, "crushing_stone_bricks", Items.STONE_BRICKS, new Reward(Items.CRACKED_STONE_BRICKS)); + hammerRecipe(writer, "crushing_sandstone", Ingredient.of(Items.SANDSTONE, Items.CUT_SANDSTONE, Items.CHISELED_SANDSTONE, Items.SMOOTH_SANDSTONE), Items.SAND); + hammerRecipe(writer, "crushing_red_sandstone", Ingredient.of(Items.RED_SANDSTONE, Items.CUT_RED_SANDSTONE, Items.CHISELED_RED_SANDSTONE, Items.SMOOTH_RED_SANDSTONE), Items.RED_SAND); + hammerRecipe(writer, "crushing_stone_bricks", Ingredient.of(Items.STONE_BRICKS), Items.CRACKED_STONE_BRICKS); - hammerRecipe(writer, "stone_pebbles", - Ingredient.of(Items.STONE, Items.CRACKED_STONE_BRICKS), - Reward.withExtraChances(EItems.STONE_PEBBLE, new float[] { 0.75f, 0.75f, 0.5f, 0.25f, 0.05f })); + hammerRecipe(writer, "stone_pebbles", Ingredient.of(Items.STONE, Items.STONE_BRICKS, Items.CHISELED_STONE_BRICKS, Items.CRACKED_STONE_BRICKS), EItems.STONE_PEBBLE.get(), new UniformGenerator(ConstantValue.exactly(1), ConstantValue.exactly(6))); } - private static void hammerRecipe(Consumer consumer, String name, Ingredient block, ImmutableList rewards) { - consumer.accept(new FinishedHammerRecipe(ERecipeSerializers.HAMMER.get(), new ResourceLocation(ExNihiloReborn.ID, "hammer/" + name), block, rewards)); + private static void hammerRecipe(Consumer writer, String name, Ingredient block, ItemLike result) { + hammerRecipe(writer, name, block, result, ConstantValue.exactly(1f)); } - private static void hammerRecipe(Consumer consumer, String name, ItemLike block, Reward... rewards) { - hammerRecipe(consumer, name, Ingredient.of(block), ImmutableList.builder().add(rewards).build()); - } - - private static void hammerRecipe(Consumer consumer, TagKey tag, Reward rewards) { - consumer.accept(new FinishedHammerRecipe(ERecipeSerializers.HAMMER.get(), new ResourceLocation(ExNihiloReborn.ID, tag.location().getPath() + "_to_" + ForgeRegistries.ITEMS.getKey(rewards.getItem().getItem()).getPath()), Ingredient.of(tag), ImmutableList.of(rewards))); + private static void hammerRecipe(Consumer consumer, String name, Ingredient block, ItemLike result, NumberProvider resultAmount) { + consumer.accept(new FinishedHammerRecipe(new ResourceLocation(ExNihiloReborn.ID, "hammer/" + name), block, result.asItem(), resultAmount)); } private static void barrelCompostRecipes(Consumer writer) { @@ -264,7 +314,25 @@ class Recipes { barrelCompost(writer, "pumpkin_pie", Ingredient.of(Items.PUMPKIN_PIE), 150); } - private static void barrelCompost(Consumer consumer, String id, Ingredient ingredient, int volume) { - consumer.accept(new FinishedBarrelCompostRecipe(new ResourceLocation(ExNihiloReborn.ID, "barrel_compost/" + id), ingredient, volume)); + private static void barrelCompost(Consumer writer, String id, Ingredient ingredient, int volume) { + writer.accept(new FinishedBarrelCompostRecipe(new ResourceLocation(ExNihiloReborn.ID, "barrel_compost/" + id), ingredient, volume)); + } + + private static void barrelMixingRecipes(Consumer writer) { + barrelMixing(writer, Ingredient.of(Items.MILK_BUCKET), ForgeMod.WATER_TYPE, Items.SLIME_BLOCK); + barrelMixing(writer, Ingredient.of(Items.SNOWBALL), ForgeMod.WATER_TYPE, Items.ICE); + barrelMixing(writer, Ingredient.of(Items.SAND), EFluids.WITCH_WATER_TYPE, Items.SOUL_SAND); + barrelMixing(writer, Ingredient.of(Items.REDSTONE), ForgeMod.LAVA_TYPE, Items.NETHERRACK); + barrelMixing(writer, Ingredient.of(Items.GLOWSTONE_DUST), ForgeMod.LAVA_TYPE, Items.END_STONE); + barrelMixing(writer, Ingredient.of(Items.WATER_BUCKET), ForgeMod.LAVA_TYPE, Items.OBSIDIAN); + barrelMixing(writer, Ingredient.of(Items.LAVA_BUCKET), ForgeMod.WATER_TYPE, Items.STONE); + } + + private static void barrelMixing(Consumer writer, Ingredient ingredient, Supplier fluidType, Item result) { + writer.accept(new FinishedBarrelMixingRecipe(new ResourceLocation(ExNihiloReborn.ID, "barrel_mixing/" + path(result)), ingredient, fluidType.get(), 1000, result)); + } + + private static String path(Item item) { + return Objects.requireNonNull(ForgeRegistries.ITEMS.getKey(item).getPath()); } } diff --git a/src/main/java/thedarkcolour/exnihiloreborn/data/StructureTags.java b/src/main/java/thedarkcolour/exnihiloreborn/data/StructureTags.java deleted file mode 100644 index 25aa71d2..00000000 --- a/src/main/java/thedarkcolour/exnihiloreborn/data/StructureTags.java +++ /dev/null @@ -1,31 +0,0 @@ -package thedarkcolour.exnihiloreborn.data; - -import net.minecraft.core.HolderLookup; -import net.minecraft.core.registries.Registries; -import net.minecraft.data.PackOutput; -import net.minecraft.data.tags.StructureTagsProvider; -import net.minecraft.data.tags.TagsProvider; -import net.minecraft.data.worldgen.StructureSets; -import net.minecraft.world.level.levelgen.structure.BuiltinStructureSets; -import net.minecraft.world.level.levelgen.structure.BuiltinStructures; -import net.minecraft.world.level.levelgen.structure.Structure; -import net.minecraft.world.level.levelgen.structure.StructureSet; -import net.minecraftforge.common.data.ExistingFileHelper; -import org.jetbrains.annotations.Nullable; -import thedarkcolour.exnihiloreborn.ExNihiloReborn; -import thedarkcolour.exnihiloreborn.tag.EStructureSetTags; - -import java.util.concurrent.CompletableFuture; - -class StructureTags extends TagsProvider { - public StructureTags(PackOutput output, CompletableFuture lookup, @Nullable ExistingFileHelper helper) { - super(output, Registries.STRUCTURE_SET, lookup, ExNihiloReborn.ID, helper); - } - - @Override - protected void addTags(HolderLookup.Provider lookup) { - tag(EStructureSetTags.OVERWORLD_VOID_STRUCTURES); - tag(EStructureSetTags.THE_NETHER_VOID_STRUCTURES).add(BuiltinStructureSets.NETHER_COMPLEXES); - tag(EStructureSetTags.THE_END_VOID_STRUCTURES); - } -} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/data/TranslationKeys.java b/src/main/java/thedarkcolour/exnihiloreborn/data/TranslationKeys.java index 55a8da91..8ca8906d 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/data/TranslationKeys.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/data/TranslationKeys.java @@ -18,14 +18,19 @@ public class TranslationKeys { public static final String STRING_MESH_ADVANCEMENT_TITLE = "advancements." + ExNihiloReborn.ID + ".core.string_mesh.title"; public static final String STRING_MESH_ADVANCEMENT_DESCRIPTION = "advancements." + ExNihiloReborn.ID + ".core.string_mesh.description"; - // JEI + // JEI descriptions public static final String SILK_WORM_JEI_INFO = "info." + ExNihiloReborn.ID + ".silk_worm"; + public static final String SIEVE_JEI_INFO = "info." + ExNihiloReborn.ID + ".sieve"; + + // JEI recipe categories public static final String BARREL_COMPOST_CATEGORY_TITLE = "gui." + ExNihiloReborn.ID + ".category.barrel_compost"; public static final String BARREL_COMPOST_RECIPE_VOLUME = "gui." + ExNihiloReborn.ID + ".category.barrel_compost.volume"; public static final String WATER_CRUCIBLE_CATEGORY_TITLE = "gui." + ExNihiloReborn.ID + ".category.water_crucible"; public static final String LAVA_CRUCIBLE_CATEGORY_TITLE = "gui." + ExNihiloReborn.ID + ".category.lava_crucible"; public static final String HAMMER_CATEGORY_TITLE = "gui." + ExNihiloReborn.ID + ".category.hammer"; - public static final String COMPRESSED_HAMMER_CATEGORY_TITLE = "gui." + ExNihiloReborn.ID + ".category.compressed_hammer"; public static final String SIEVE_CATEGORY_TITLE = "gui." + ExNihiloReborn.ID + ".category.sieve"; - public static final String COMPRESSED_SIEVE_CATEGORY_TITLE = "gui." + ExNihiloReborn.ID + ".category.compressed_sieve"; + public static final String SIEVE_RECIPE_CHANCE = "gui." + ExNihiloReborn.ID + ".category.sieve.chance"; + public static final String SIEVE_RECIPE_AVERAGE_OUTPUT = "gui." + ExNihiloReborn.ID + ".category.sieve.average_output"; + public static final String SIEVE_RECIPE_MIN_OUTPUT = "gui." + ExNihiloReborn.ID + ".category.sieve.min_output"; + public static final String SIEVE_RECIPE_MAX_OUTPUT = "gui." + ExNihiloReborn.ID + ".category.sieve.max_output"; } diff --git a/src/main/java/thedarkcolour/exnihiloreborn/data/WorldPresetTags.java b/src/main/java/thedarkcolour/exnihiloreborn/data/WorldPresetTags.java deleted file mode 100644 index d6a19ce8..00000000 --- a/src/main/java/thedarkcolour/exnihiloreborn/data/WorldPresetTags.java +++ /dev/null @@ -1,24 +0,0 @@ -package thedarkcolour.exnihiloreborn.data; - -import net.minecraft.core.HolderLookup; -import net.minecraft.core.registries.Registries; -import net.minecraft.data.PackOutput; -import net.minecraft.data.tags.WorldPresetTagsProvider; -import net.minecraft.resources.ResourceKey; -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.common.data.ExistingFileHelper; -import org.jetbrains.annotations.Nullable; -import thedarkcolour.exnihiloreborn.ExNihiloReborn; - -import java.util.concurrent.CompletableFuture; - -public class WorldPresetTags extends WorldPresetTagsProvider { - public WorldPresetTags(PackOutput output, CompletableFuture lookup, @Nullable ExistingFileHelper helper) { - super(output, lookup, ExNihiloReborn.ID, helper); - } - - @Override - protected void addTags(HolderLookup.Provider lookup) { - tag(net.minecraft.tags.WorldPresetTags.NORMAL).add(ResourceKey.create(Registries.WORLD_PRESET, new ResourceLocation(ExNihiloReborn.ID, "void_world"))); - } -} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/event/EventHandler.java b/src/main/java/thedarkcolour/exnihiloreborn/event/EventHandler.java index 6d07292f..ac11dc69 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/event/EventHandler.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/event/EventHandler.java @@ -21,8 +21,7 @@ import net.minecraftforge.fml.InterModComms; import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import thedarkcolour.exnihiloreborn.ExNihiloReborn; -import thedarkcolour.exnihiloreborn.blockentity.LavaCrucibleBlockEntity; -import thedarkcolour.exnihiloreborn.blockentity.WaterCrucibleBlockEntity; +import thedarkcolour.exnihiloreborn.recipe.RecipeUtil; import thedarkcolour.exnihiloreborn.client.CompostColors; import thedarkcolour.exnihiloreborn.voidworld.VoidChunkGenerator; import thedarkcolour.exnihiloreborn.compat.top.TopCompatExNihiloReborn; @@ -99,13 +98,12 @@ public final class EventHandler { InterModComms.sendTo("theoneprobe", "getTheOneProbe", TopCompatExNihiloReborn::new); } - public static void addReloadListeners(AddReloadListenerEvent event) { + private static void addReloadListeners(AddReloadListenerEvent event) { var recipes = event.getServerResources().getRecipeManager(); event.addListener((prepBarrier, resourceManager, prepProfiler, reloadProfiler, backgroundExecutor, gameExecutor) -> { return CompletableFuture.allOf().thenCompose(prepBarrier::wait).thenRunAsync(() -> { - LavaCrucibleBlockEntity.RECIPES_CACHE.invalidateAll(); - WaterCrucibleBlockEntity.RECIPES_CACHE.invalidateAll(); HammerItem.refreshValidBlocks(recipes); + RecipeUtil.reload(recipes); }, gameExecutor); }); } diff --git a/src/main/java/thedarkcolour/exnihiloreborn/fluid/WitchWaterFluid.java b/src/main/java/thedarkcolour/exnihiloreborn/fluid/WitchWaterFluid.java index 83bd2b27..a83eef92 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/fluid/WitchWaterFluid.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/fluid/WitchWaterFluid.java @@ -19,7 +19,7 @@ public class WitchWaterFluid extends FluidType { private static final ResourceLocation OVERLAY_TEXTURE = new ResourceLocation("block/water_overlay"); public static ForgeFlowingFluid.Properties properties() { - return new ForgeFlowingFluid.Properties(EFluids.WITCH_WATER, EFluids.WITCH_WATER_STILL, EFluids.WITCH_WATER_FLOWING).block(EBlocks.WITCH_WATER).bucket(EItems.WITCH_WATER_BUCKET); + return new ForgeFlowingFluid.Properties(EFluids.WITCH_WATER_TYPE, EFluids.WITCH_WATER_STILL, EFluids.WITCH_WATER_FLOWING).block(EBlocks.WITCH_WATER).bucket(EItems.WITCH_WATER_BUCKET); } public WitchWaterFluid() { diff --git a/src/main/java/thedarkcolour/exnihiloreborn/item/GrassSpreaderItem.java b/src/main/java/thedarkcolour/exnihiloreborn/item/GrassSpreaderItem.java new file mode 100644 index 00000000..f375d9a1 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/item/GrassSpreaderItem.java @@ -0,0 +1,42 @@ +package thedarkcolour.exnihiloreborn.item; + +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; + +import java.util.function.Supplier; + +public class GrassSpreaderItem extends Item { + private final Supplier grassState; + + public GrassSpreaderItem(Properties pProperties, Supplier grassState) { + super(pProperties); + this.grassState = grassState; + } + + @Override + public InteractionResult useOn(UseOnContext ctx) { + var level = ctx.getLevel(); + var pos = ctx.getClickedPos(); + var player = ctx.getPlayer(); + + if (level.getBlockState(pos).is(Blocks.DIRT)) { + if (!level.isClientSide) { + level.setBlock(pos, grassState.get(), 3); + + return InteractionResult.CONSUME; + } + + // apparently shrinking is done on both sides? + if (player == null || !player.getAbilities().instabuild) { + ctx.getItemInHand().shrink(1); + } + + return InteractionResult.SUCCESS; + } + + return InteractionResult.PASS; + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/item/HammerItem.java b/src/main/java/thedarkcolour/exnihiloreborn/item/HammerItem.java index 7631cb58..776d9228 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/item/HammerItem.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/item/HammerItem.java @@ -24,6 +24,7 @@ public class HammerItem extends DiggerItem { } public static void refreshValidBlocks(RecipeManager recipes) { + VALID_BLOCKS.clear(); for (var recipe : recipes.byType(ERecipeTypes.HAMMER.get()).values()) { for (var item : recipe.getIngredient().getItems()) { if (item.getItem() instanceof BlockItem blockItem) { diff --git a/src/main/java/thedarkcolour/exnihiloreborn/item/MeshItem.java b/src/main/java/thedarkcolour/exnihiloreborn/item/MeshItem.java new file mode 100644 index 00000000..3cbeec1c --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/item/MeshItem.java @@ -0,0 +1,17 @@ +package thedarkcolour.exnihiloreborn.item; + +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.Enchantments; + +public class MeshItem extends Item { + public MeshItem(Properties properties) { + super(properties); + } + + @Override + public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { + return enchantment == Enchantments.BLOCK_EFFICIENCY || enchantment == Enchantments.BLOCK_FORTUNE; + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/loot/HammerLootModifier.java b/src/main/java/thedarkcolour/exnihiloreborn/loot/HammerLootModifier.java index 98fc0d83..e451590f 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/loot/HammerLootModifier.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/loot/HammerLootModifier.java @@ -6,25 +6,20 @@ import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.minecraft.world.SimpleContainer; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.world.item.crafting.RecipeType; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; import net.minecraftforge.common.loot.IGlobalLootModifier; import net.minecraftforge.common.loot.LootModifier; -import net.minecraftforge.registries.ForgeRegistries; -import thedarkcolour.exnihiloreborn.recipe.RewardRecipe; +import thedarkcolour.exnihiloreborn.registry.ERecipeTypes; import javax.annotation.Nonnull; public class HammerLootModifier extends LootModifier { - public static final Codec CODEC = RecordCodecBuilder.create(inst -> LootModifier.codecStart(inst).and(ForgeRegistries.RECIPE_TYPES.getCodec().fieldOf("reward_recipe_type").forGetter(modifier -> modifier.type)).apply(inst, HammerLootModifier::new)); - private final RecipeType type; + public static final Codec CODEC = RecordCodecBuilder.create(inst -> LootModifier.codecStart(inst).apply(inst, HammerLootModifier::new)); - @SuppressWarnings("unchecked") - protected HammerLootModifier(LootItemCondition[] conditionsIn, RecipeType type) { + protected HammerLootModifier(LootItemCondition[] conditionsIn) { super(conditionsIn); - this.type = (RecipeType) type; } @Nonnull @@ -35,18 +30,15 @@ public class HammerLootModifier extends LootModifier { if (state != null && state.getBlock().asItem() != Items.AIR) { var temporaryItem = new SimpleContainer(new ItemStack(state.getBlock().asItem())); - var recipe = level.getRecipeManager().getRecipeFor(type, temporaryItem, level); + var recipe = level.getRecipeManager().getRecipeFor(ERecipeTypes.HAMMER.get(), temporaryItem, level); if (recipe.isPresent()) { - var rand = level.random; ObjectArrayList newLoot = new ObjectArrayList<>(); + var resultAmount = recipe.get().resultAmount.getInt(context); - for (var reward : recipe.get().getRewards()) { - if (rand.nextFloat() < reward.getChance()) { - newLoot.add(reward.getItem().copy()); - } + if (resultAmount > 0) { + newLoot.add(new ItemStack(recipe.get().result, resultAmount)); } - return newLoot; } } diff --git a/src/main/java/thedarkcolour/exnihiloreborn/network/ClientMessageHandler.java b/src/main/java/thedarkcolour/exnihiloreborn/network/ClientMessageHandler.java index f72c1eaf..172e2cdc 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/network/ClientMessageHandler.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/network/ClientMessageHandler.java @@ -1,53 +1,17 @@ package thedarkcolour.exnihiloreborn.network; import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraftforge.fml.unsafe.UnsafeHacks; -import net.minecraftforge.fml.util.ObfuscationReflectionHelper; -import sun.misc.Unsafe; -import thedarkcolour.exnihiloreborn.ExNihiloReborn; - -import java.lang.reflect.Field; public class ClientMessageHandler { - private static final Field CLIENT_LEVEL_DATA_FIELD; - private static final Field IS_FLAT_FIELD; - private static final boolean PATCH_VOID; - private static final Unsafe UNSAFE; - public static boolean isInVoidWorld; - static { - Field clientLevelDataField = null; - Field isFlatField = null; - Unsafe unsafe = null; - - try { - clientLevelDataField = ObfuscationReflectionHelper.findField(ClientLevel.class, "f_104563_"); - isFlatField = ObfuscationReflectionHelper.findField(ClientLevel.ClientLevelData.class, "f_104832_"); - - // copied from UnsafeHacks - final Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe"); - theUnsafe.setAccessible(true); - unsafe = (Unsafe)theUnsafe.get(null); - } catch (Exception e) { - e.printStackTrace(); - ExNihiloReborn.LOGGER.error("Error: Could not patch void renderer. Please open an issue on ExNihiloReborn GitHub!"); - } - CLIENT_LEVEL_DATA_FIELD = clientLevelDataField; - IS_FLAT_FIELD = isFlatField; - UNSAFE = unsafe; - PATCH_VOID = CLIENT_LEVEL_DATA_FIELD != null && IS_FLAT_FIELD != null && UNSAFE != null; - } - // Removes the black sky/fog that appears when the player is below y=62 public static void disableVoidFogRendering() { isInVoidWorld = true; - if (PATCH_VOID) { - var obj = UnsafeHacks.getField(CLIENT_LEVEL_DATA_FIELD, Minecraft.getInstance().level); - long offset = UNSAFE.objectFieldOffset(IS_FLAT_FIELD); - UNSAFE.putBoolean(obj, offset, true); + var level = Minecraft.getInstance().level; + if (level != null) { + level.clientLevelData.isFlat = true; } } } diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/EFinishedRecipe.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/EFinishedRecipe.java new file mode 100644 index 00000000..bd3968b1 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/EFinishedRecipe.java @@ -0,0 +1,20 @@ +package thedarkcolour.exnihiloreborn.recipe; + +import com.google.gson.JsonObject; +import net.minecraft.data.recipes.FinishedRecipe; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.Nullable; + +public interface EFinishedRecipe extends FinishedRecipe { + @Nullable + @Override + default JsonObject serializeAdvancement() { + return null; + } + + @Nullable + @Override + default ResourceLocation getAdvancementId() { + return null; + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/ProbabilityRecipe.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/ProbabilityRecipe.java new file mode 100644 index 00000000..1ca7f03c --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/ProbabilityRecipe.java @@ -0,0 +1,20 @@ +package thedarkcolour.exnihiloreborn.recipe; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.LootParams; +import net.minecraft.world.level.storage.loot.providers.number.NumberProvider; + +public abstract class ProbabilityRecipe extends SingleIngredientRecipe { + public final Item result; + public final NumberProvider resultAmount; + + public ProbabilityRecipe(ResourceLocation id, Ingredient ingredient, Item result, NumberProvider resultAmount) { + super(id, ingredient); + this.result = result; + this.resultAmount = resultAmount; + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/RecipeUtil.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/RecipeUtil.java new file mode 100644 index 00000000..a97dfd90 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/RecipeUtil.java @@ -0,0 +1,260 @@ +package thedarkcolour.exnihiloreborn.recipe; + +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.gson.JsonObject; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.Container; +import net.minecraft.world.item.Item; +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.RecipeManager; +import net.minecraft.world.item.crafting.RecipeType; +import net.minecraft.world.level.storage.loot.LootDataType; +import net.minecraft.world.level.storage.loot.providers.number.BinomialDistributionGenerator; +import net.minecraft.world.level.storage.loot.providers.number.ConstantValue; +import net.minecraft.world.level.storage.loot.providers.number.NumberProvider; +import net.minecraft.world.level.storage.loot.providers.number.NumberProviders; +import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator; +import net.minecraftforge.common.util.Lazy; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.Nullable; +import thedarkcolour.exnihiloreborn.recipe.barrel.BarrelCompostRecipe; +import thedarkcolour.exnihiloreborn.recipe.barrel.BarrelMixingRecipe; +import thedarkcolour.exnihiloreborn.recipe.crucible.CrucibleRecipe; +import thedarkcolour.exnihiloreborn.recipe.sieve.SieveRecipe; +import thedarkcolour.exnihiloreborn.registry.ERecipeTypes; + +import java.time.Duration; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; + +public final class RecipeUtil { + private static final int CONSTANT_TYPE = 1; + private static final int UNIFORM_TYPE = 2; + private static final int BINOMIAL_TYPE = 3; + private static final int UNKNOWN_TYPE = 99; + + private static final Cache> SIEVE_RECIPE_CACHE = CacheBuilder.newBuilder().expireAfterAccess(Duration.ofMinutes(3)).build(); + private static Lazy> barrelCompostRecipeCache; + private static Lazy> lavaCrucibleRecipeCache; + private static Lazy> waterCrucibleRecipeCache; + + public static void reload(RecipeManager recipes) { + SIEVE_RECIPE_CACHE.invalidateAll(); + + barrelCompostRecipeCache = Lazy.of(() -> loadSimpleRecipeCache(recipes, ERecipeTypes.BARREL_COMPOST)); + lavaCrucibleRecipeCache = Lazy.of(() -> loadSimpleRecipeCache(recipes, ERecipeTypes.LAVA_CRUCIBLE)); + waterCrucibleRecipeCache = Lazy.of(() -> loadSimpleRecipeCache(recipes, ERecipeTypes.WATER_CRUCIBLE)); + } + + private static ImmutableMap loadSimpleRecipeCache(RecipeManager recipes, Supplier> recipeType) { + var builder = new ImmutableMap.Builder(); + for (var recipe : recipes.byType(recipeType.get()).values()) { + for (var item : recipe.getIngredient().getItems()) { + builder.put(item.getItem(), recipe); + } + } + + return builder.buildKeepingLast(); + } + + public static List getSieveRecipes(RecipeManager manager, Item mesh, ItemStack item) { + var cacheKey = new SieveCacheKey(mesh, item.getItem()); + var cacheVal = SIEVE_RECIPE_CACHE.getIfPresent(cacheKey); + if (cacheVal != null) return cacheVal; + + var builder = new ImmutableList.Builder(); + var cache = true; + + for (var recipe : byType(manager, ERecipeTypes.SIEVE.get())) { + if (recipe.test(mesh, item)) { + builder.add(recipe); + + if (recipe.dependsOnNbt) { + cache = false; + } + } + } + + var recipes = builder.build(); + if (cache) { + SIEVE_RECIPE_CACHE.put(cacheKey, recipes); + } + + return recipes; + } + + public static CrucibleRecipe getLavaCrucibleRecipe(ItemStack item) { + return lavaCrucibleRecipeCache.get().get(item.getItem()); + } + + public static CrucibleRecipe getWaterCrucibleRecipe(ItemStack item) { + return waterCrucibleRecipeCache.get().get(item.getItem()); + } + + public static BarrelCompostRecipe getBarrelCompostRecipe(ItemStack playerItem) { + return barrelCompostRecipeCache.get().get(playerItem.getItem()); + } + + public static > Collection byType(RecipeManager manager, RecipeType type) { + return manager.byType(type).values(); + } + + public static Ingredient readIngredient(JsonObject json, String key) { + if (GsonHelper.isArrayNode(json, key)) { + return Ingredient.fromJson(GsonHelper.getAsJsonArray(json, key)); + } else { + return Ingredient.fromJson(GsonHelper.getAsJsonObject(json, key)); + } + } + + public static Item readItem(JsonObject json, String key) { + return ForgeRegistries.ITEMS.getValue(new ResourceLocation(GsonHelper.getAsString(json, key))); + } + + public static NumberProvider readNumberProvider(JsonObject json, String key) { + var obj = json.get(key); + return LootDataType.PREDICATE.parser().fromJson(obj, NumberProvider.class); + } + + public static void toNetworkNumberProvider(FriendlyByteBuf buffer, NumberProvider provider) { + if (provider.getType() == NumberProviders.CONSTANT) { + buffer.writeByte(CONSTANT_TYPE); + buffer.writeFloat(((ConstantValue) provider).value); + } else if (provider.getType() == NumberProviders.UNIFORM) { + var uniform = (UniformGenerator) provider; + buffer.writeByte(UNIFORM_TYPE); + toNetworkNumberProvider(buffer, uniform.min); + toNetworkNumberProvider(buffer, uniform.max); + } else if (provider.getType() == NumberProviders.BINOMIAL) { + var binomial = (BinomialDistributionGenerator) provider; + buffer.writeByte(BINOMIAL_TYPE); + toNetworkNumberProvider(buffer, binomial.n); + toNetworkNumberProvider(buffer, binomial.p); + } else { + buffer.writeByte(UNKNOWN_TYPE); + } + } + + public static NumberProvider fromNetworkNumberProvider(FriendlyByteBuf buffer) { + return switch (buffer.readByte()) { + case CONSTANT_TYPE -> ConstantValue.exactly(buffer.readFloat()); + case UNIFORM_TYPE -> new UniformGenerator(fromNetworkNumberProvider(buffer), fromNetworkNumberProvider(buffer)); + case BINOMIAL_TYPE -> new BinomialDistributionGenerator(fromNetworkNumberProvider(buffer), fromNetworkNumberProvider(buffer)); + default -> ConstantValue.exactly(1f); + }; + } + + public static boolean areIngredientsEqual(Ingredient first, Ingredient second) { + // although unlikely, we should check this anyway + if (first == second) return true; + + if (first.isVanilla() && second.isVanilla()) { + Ingredient.Value[] firstValues = first.values; + Ingredient.Value[] secondValues = second.values; + + // if arrays are same size, check if their contents are equal (order matters) + if (firstValues.length == secondValues.length) { + for (int i = 0; i < firstValues.length; i++) { + Ingredient.Value firstValue = firstValues[i]; + Ingredient.Value secondValue = secondValues[i]; + Class firstKlass = firstValue.getClass(); + Class secondKlass = secondValue.getClass(); + + // if values are the same type of class + if (firstKlass == secondKlass) { + if (firstKlass == Ingredient.ItemValue.class) { + // if items are different, return false + if (!ItemStack.matches(((Ingredient.ItemValue) firstValue).item, ((Ingredient.ItemValue) secondValue).item)) { + return false; + } + } else if (firstKlass == Ingredient.TagValue.class) { + // if tags are different, return false + // identity comparison is okay because tags are always interned in vanilla + if (((Ingredient.TagValue) firstValue).tag != ((Ingredient.TagValue) secondValue).tag) { + return false; + } + } else { + var firstItems = firstValue.getItems(); + var secondItems = secondValue.getItems(); + var len = firstItems.size(); + + if (len == secondItems.size()) { + Iterator firstIter = firstItems.iterator(); + Iterator secondIter = secondItems.iterator(); + + while (firstIter.hasNext()) { + if (!ItemStack.matches(firstIter.next(), secondIter.next())) { + // if one of the items is different, return false + return false; + } + } + } else { + // if values have different amounts of items, return false + return false; + } + } + } else { + // if the values are different types, return false + return false; + } + } + + // return true if everything was equal + return true; + } + } + + return false; + } + + public static boolean hasSieveResult(RecipeManager recipes, Item mesh, ItemStack stack) { + for (var recipe : byType(recipes, ERecipeTypes.SIEVE.get())) { + if (recipe.test(mesh, stack)) { + return true; + } + } + + return false; + } + + public static boolean isCompostable(ItemStack stack) { + return barrelCompostRecipeCache != null && barrelCompostRecipeCache.get().containsKey(stack.getItem()); + } + + public static @Nullable BarrelMixingRecipe getBarrelMixingRecipe(RecipeManager recipes, ItemStack stack, FluidStack fluid) { + for (var recipe : byType(recipes, ERecipeTypes.BARREL_MIXING.get())) { + if (recipe.matches(stack, fluid)) { + return recipe; + } + } + + return null; + } + + public static double getExpectedValue(NumberProvider provider) { + if (provider instanceof ConstantValue constant) { + return constant.value; + } else if (provider instanceof UniformGenerator uniform) { + return getExpectedValue(uniform.min) + getExpectedValue(uniform.max) / 2.0; + } else if (provider instanceof BinomialDistributionGenerator binomial) { + return getExpectedValue(binomial.n) * getExpectedValue(binomial.p); + } else { + // no way of knowing beforehand so just put them last + return -1.0; + } + } + + private record SieveCacheKey(Item mesh, Item ingredient) { + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/Reward.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/Reward.java deleted file mode 100644 index 7a199fab..00000000 --- a/src/main/java/thedarkcolour/exnihiloreborn/recipe/Reward.java +++ /dev/null @@ -1,71 +0,0 @@ -package thedarkcolour.exnihiloreborn.recipe; - -import com.google.common.collect.ImmutableList; -import com.mojang.serialization.Codec; -import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.ItemLike; -import net.minecraftforge.registries.RegistryObject; - -import java.util.function.Supplier; - -public final class Reward { - public static final Codec CODEC = RecordCodecBuilder.create(builder -> builder.group( - ItemStack.CODEC.fieldOf("item").forGetter(Reward::getItem), - Codec.FLOAT.fieldOf("chance").forGetter(Reward::getChance) - ).apply(builder, Reward::new)); - private final ItemStack item; - private final float chance; - - public Reward(ItemStack item, float chance) { - this.item = item; - this.chance = chance; - } - - public static Reward of(RegistryObject item) { - return of(item, 1.0f); - } - - public static Reward of(RegistryObject item, float chance) { - return new Reward(new ItemStack(item.get()), chance); - } - - public static Reward of(ItemLike item, float chance) { - return new Reward(new ItemStack(item), chance); - } - - public Reward(ItemLike item) { - this(new ItemStack(item), 1.0f); - } - - public static ImmutableList withExtraChances(Supplier supplier, float[] chances) { - Item item = supplier.get(); - ImmutableList.Builder builder = ImmutableList.builder(); - builder.add(new Reward(item)); - - for (float chance : chances) { - builder.add(new Reward(new ItemStack(item), chance)); - } - - return builder.build(); - } - - public ItemStack getItem() { - return item; - } - - public float getChance() { - return chance; - } - - public void toNetwork(FriendlyByteBuf buffer) { - buffer.writeItem(getItem()); - buffer.writeFloat(getChance()); - } - - public static Reward fromNetwork(FriendlyByteBuf buffer) { - return new Reward(buffer.readItem(), buffer.readFloat()); - } -} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/RewardRecipe.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/RewardRecipe.java deleted file mode 100644 index fa8e90db..00000000 --- a/src/main/java/thedarkcolour/exnihiloreborn/recipe/RewardRecipe.java +++ /dev/null @@ -1,75 +0,0 @@ -package thedarkcolour.exnihiloreborn.recipe; - -import com.google.common.collect.ImmutableList; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.mojang.datafixers.util.Function3; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.GsonHelper; -import net.minecraft.world.item.crafting.Ingredient; -import net.minecraft.world.item.crafting.RecipeSerializer; - -import javax.annotation.Nullable; - -public abstract class RewardRecipe extends SingleIngredientRecipe { - private final ImmutableList rewards; - - public RewardRecipe(ResourceLocation id, Ingredient ingredient, ImmutableList rewards) { - super(id, ingredient); - this.rewards = rewards; - } - - public ImmutableList getRewards() { - return rewards; - } - - public static class Serializer implements RecipeSerializer { - private final Function3, T> factory; - - public Serializer(Function3, T> factory) { - this.factory = factory; - } - - @Override - public T fromJson(ResourceLocation name, JsonObject json) { - Ingredient ingredient = readIngredient(json, "ingredient"); - - // Rewards must be a list - JsonArray rewardsJson = GsonHelper.getAsJsonArray(json, "rewards"); - ImmutableList.Builder rewards = ImmutableList.builder(); - - for (JsonElement element : rewardsJson) { - rewards.add(CodecUtil.decode(Reward.CODEC, element)); - } - - return factory.apply(name, ingredient, rewards.build()); - } - - @Nullable - @Override - public T fromNetwork(ResourceLocation name, FriendlyByteBuf buffer) { - Ingredient ingredient = Ingredient.fromNetwork(buffer); - ImmutableList.Builder rewards = ImmutableList.builder(); - - for (int i = 0; i < buffer.readVarInt(); i++) { - rewards.add(Reward.fromNetwork(buffer)); - } - - return factory.apply(name, ingredient, rewards.build()); - } - - @Override - public void toNetwork(FriendlyByteBuf buffer, T recipe) { - recipe.getIngredient().toNetwork(buffer); - - ImmutableList rewards = recipe.getRewards(); - buffer.writeVarInt(rewards.size()); - - for (Reward reward : rewards) { - reward.toNetwork(buffer); - } - } - } -} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/SingleIngredientRecipe.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/SingleIngredientRecipe.java index 8dcc96c8..c7cf90a6 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/recipe/SingleIngredientRecipe.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/SingleIngredientRecipe.java @@ -1,10 +1,8 @@ package thedarkcolour.exnihiloreborn.recipe; -import com.google.gson.JsonObject; import net.minecraft.core.NonNullList; import net.minecraft.core.RegistryAccess; import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.GsonHelper; import net.minecraft.world.Container; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; @@ -21,11 +19,13 @@ import net.minecraft.world.level.Level; */ public abstract class SingleIngredientRecipe implements Recipe { private final ResourceLocation id; - private final Ingredient ingredient; + protected final Ingredient ingredient; + public final boolean dependsOnNbt; public SingleIngredientRecipe(ResourceLocation id, Ingredient ingredient) { this.id = id; this.ingredient = ingredient; + this.dependsOnNbt = !ingredient.isSimple(); } public Ingredient getIngredient() { @@ -42,16 +42,6 @@ public abstract class SingleIngredientRecipe implements Recipe { return ItemStack.EMPTY; } - @Override - public RecipeSerializer getSerializer() { - return null; - } - - @Override - public RecipeType getType() { - return null; - } - @Override public boolean canCraftInDimensions(int width, int height) { return true; @@ -67,17 +57,12 @@ public abstract class SingleIngredientRecipe implements Recipe { return ItemStack.EMPTY; } + /** + * @deprecated Only used in Vanilla recipe books, and my blocks do not use the recipe book! + */ @Deprecated @Override public NonNullList getIngredients() { return NonNullList.create(); } - - public static Ingredient readIngredient(JsonObject json, String key) { - if (GsonHelper.isArrayNode(json, key)) { - return Ingredient.fromJson(GsonHelper.getAsJsonArray(json, key)); - } else { - return Ingredient.fromJson(GsonHelper.getAsJsonObject(json, key)); - } - } } diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/barrel/BarrelCompostRecipe.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/barrel/BarrelCompostRecipe.java index 0beb4d4d..a152f3d2 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/recipe/barrel/BarrelCompostRecipe.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/barrel/BarrelCompostRecipe.java @@ -7,6 +7,7 @@ import net.minecraft.util.GsonHelper; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; +import thedarkcolour.exnihiloreborn.recipe.RecipeUtil; import thedarkcolour.exnihiloreborn.recipe.SingleIngredientRecipe; import thedarkcolour.exnihiloreborn.registry.ERecipeSerializers; import thedarkcolour.exnihiloreborn.registry.ERecipeTypes; @@ -37,14 +38,7 @@ public class BarrelCompostRecipe extends SingleIngredientRecipe { public static class Serializer implements RecipeSerializer { @Override // Creates the recipe object from a JSON file public BarrelCompostRecipe fromJson(ResourceLocation name, JsonObject json) { - Ingredient ingredient; - - if (GsonHelper.isArrayNode(json, "ingredient")) { - ingredient = Ingredient.fromJson(GsonHelper.getAsJsonArray(json, "ingredient")); - } else { - ingredient = Ingredient.fromJson(GsonHelper.getAsJsonObject(json, "ingredient")); - } - + Ingredient ingredient = RecipeUtil.readIngredient(json, "ingredient"); int volume = GsonHelper.getAsInt(json, "volume"); return new BarrelCompostRecipe(name, ingredient, volume); @@ -52,7 +46,7 @@ public class BarrelCompostRecipe extends SingleIngredientRecipe { @Override public void toNetwork(FriendlyByteBuf buffer, BarrelCompostRecipe recipe) { - recipe.getIngredient().toNetwork(buffer); + recipe.ingredient.toNetwork(buffer); buffer.writeVarInt(recipe.getVolume()); } diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/barrel/BarrelMixingRecipe.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/barrel/BarrelMixingRecipe.java new file mode 100644 index 00000000..12340cd2 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/barrel/BarrelMixingRecipe.java @@ -0,0 +1,85 @@ +package thedarkcolour.exnihiloreborn.recipe.barrel; + +import com.google.gson.JsonObject; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.Container; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +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 net.minecraftforge.fluids.FluidType; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.Nullable; +import thedarkcolour.exnihiloreborn.recipe.RecipeUtil; +import thedarkcolour.exnihiloreborn.recipe.SingleIngredientRecipe; +import thedarkcolour.exnihiloreborn.registry.ERecipeSerializers; +import thedarkcolour.exnihiloreborn.registry.ERecipeTypes; + +public class BarrelMixingRecipe extends SingleIngredientRecipe { + public final FluidType fluidType; + public final int fluidAmount; + public final Item result; + + public BarrelMixingRecipe(ResourceLocation id, Ingredient ingredient, FluidType fluidType, int fluidAmount, Item result) { + super(id, ingredient); + this.fluidType = fluidType; + this.fluidAmount = fluidAmount; + this.result = result; + } + + // Do not use + @Override + @Deprecated + public boolean matches(Container inventory, Level level) { + return false; + } + + public boolean matches(ItemStack item, FluidStack fluid) { + return ingredient.test(item) && fluid.getFluid().getFluidType() == fluidType && fluid.getAmount() >= fluidAmount; + } + + @Override + public RecipeSerializer getSerializer() { + return ERecipeSerializers.BARREL_MIXING.get(); + } + + @Override + public RecipeType getType() { + return ERecipeTypes.BARREL_MIXING.get(); + } + + public static class Serializer implements RecipeSerializer { + @Override + public BarrelMixingRecipe fromJson(ResourceLocation name, JsonObject json) { + Ingredient ingredient = RecipeUtil.readIngredient(json, "ingredient"); + FluidType fluidType = ForgeRegistries.FLUID_TYPES.get().getValue(new ResourceLocation(GsonHelper.getAsString(json, "fluid_type"))); + int fluidAmount = GsonHelper.getAsInt(json, "fluid_amount"); + Item result = ForgeRegistries.ITEMS.getValue(new ResourceLocation(GsonHelper.getAsString(json, "result"))); + + return new BarrelMixingRecipe(name, ingredient, fluidType, fluidAmount, result); + } + + @Override + public void toNetwork(FriendlyByteBuf buffer, BarrelMixingRecipe recipe) { + recipe.ingredient.toNetwork(buffer); + buffer.writeRegistryId(ForgeRegistries.FLUID_TYPES.get(), recipe.fluidType); + buffer.writeVarInt(recipe.fluidAmount); + buffer.writeRegistryId(ForgeRegistries.ITEMS, recipe.result); + } + + @Override + public @Nullable BarrelMixingRecipe fromNetwork(ResourceLocation name, FriendlyByteBuf buffer) { + Ingredient ingredient = Ingredient.fromNetwork(buffer); + FluidType fluidType = buffer.readRegistryId(); + int fluidAmount = buffer.readVarInt(); + Item result = buffer.readRegistryId(); + + return new BarrelMixingRecipe(name, ingredient, fluidType, fluidAmount, result); + } + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/barrel/FinishedBarrelCompostRecipe.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/barrel/FinishedBarrelCompostRecipe.java index dfea370c..f494b30b 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/recipe/barrel/FinishedBarrelCompostRecipe.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/barrel/FinishedBarrelCompostRecipe.java @@ -6,12 +6,12 @@ import net.minecraft.data.recipes.FinishedRecipe; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.RecipeSerializer; +import thedarkcolour.exnihiloreborn.recipe.EFinishedRecipe; import thedarkcolour.exnihiloreborn.registry.ERecipeSerializers; import javax.annotation.Nullable; -public class FinishedBarrelCompostRecipe implements FinishedRecipe { - private final Advancement.Builder advancement = Advancement.Builder.advancement(); +public class FinishedBarrelCompostRecipe implements EFinishedRecipe { private final ResourceLocation id; private final Ingredient ingredient; private final int volume; @@ -37,16 +37,4 @@ public class FinishedBarrelCompostRecipe implements FinishedRecipe { public RecipeSerializer getType() { return ERecipeSerializers.BARREL_COMPOST.get(); } - - @Nullable - @Override - public JsonObject serializeAdvancement() { - return null; - } - - @Nullable - @Override - public ResourceLocation getAdvancementId() { - return null; - } } diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/barrel/FinishedBarrelMixingRecipe.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/barrel/FinishedBarrelMixingRecipe.java new file mode 100644 index 00000000..887d7d89 --- /dev/null +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/barrel/FinishedBarrelMixingRecipe.java @@ -0,0 +1,45 @@ +package thedarkcolour.exnihiloreborn.recipe.barrel; + +import com.google.gson.JsonObject; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraftforge.fluids.FluidType; +import net.minecraftforge.registries.ForgeRegistries; +import thedarkcolour.exnihiloreborn.recipe.EFinishedRecipe; +import thedarkcolour.exnihiloreborn.registry.ERecipeSerializers; + +public class FinishedBarrelMixingRecipe implements EFinishedRecipe { + private final ResourceLocation id; + private final Ingredient ingredient; + private final FluidType fluidType; + private final int fluidAmount; + private final Item result; + + public FinishedBarrelMixingRecipe(ResourceLocation id, Ingredient ingredient, FluidType fluidType, int fluidAmount, Item result) { + this.id = id; + this.ingredient = ingredient; + this.fluidType = fluidType; + this.fluidAmount = fluidAmount; + this.result = result; + } + + @Override + public void serializeRecipeData(JsonObject json) { + json.add("ingredient", this.ingredient.toJson()); + json.addProperty("fluid_type", ForgeRegistries.FLUID_TYPES.get().getKey(this.fluidType).toString()); + json.addProperty("fluid_amount", this.fluidAmount); + json.addProperty("result", ForgeRegistries.ITEMS.getKey(this.result).toString()); + } + + @Override + public ResourceLocation getId() { + return this.id; + } + + @Override + public RecipeSerializer getType() { + return ERecipeSerializers.BARREL_MIXING.get(); + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/crucible/CrucibleRecipe.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/crucible/CrucibleRecipe.java index dd1a3531..1d35f558 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/recipe/crucible/CrucibleRecipe.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/crucible/CrucibleRecipe.java @@ -7,6 +7,7 @@ import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; import net.minecraftforge.fluids.FluidStack; +import thedarkcolour.exnihiloreborn.recipe.RecipeUtil; import thedarkcolour.exnihiloreborn.recipe.CodecUtil; import thedarkcolour.exnihiloreborn.recipe.SingleIngredientRecipe; import thedarkcolour.exnihiloreborn.registry.ERecipeSerializers; @@ -21,6 +22,10 @@ public class CrucibleRecipe extends SingleIngredientRecipe { super(id, ingredient); this.type = type; this.result = result; + + if (this.dependsOnNbt) { + throw new IllegalArgumentException("Cannot use NBT to determine Ex Nihilo Reborn Crucible output"); + } } public FluidStack getResult() { @@ -46,7 +51,7 @@ public class CrucibleRecipe extends SingleIngredientRecipe { @Override public CrucibleRecipe fromJson(ResourceLocation id, JsonObject json) { - Ingredient ingredient = readIngredient(json, "ingredient"); + Ingredient ingredient = RecipeUtil.readIngredient(json, "ingredient"); FluidStack stack = CodecUtil.decode(FluidStack.CODEC, json.get("fluid")); return new CrucibleRecipe(id, type, ingredient, stack); diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/crucible/FinishedCrucibleRecipe.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/crucible/FinishedCrucibleRecipe.java index 3435dfd0..53bdff5e 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/recipe/crucible/FinishedCrucibleRecipe.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/crucible/FinishedCrucibleRecipe.java @@ -8,10 +8,11 @@ import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.level.material.Fluid; import net.minecraftforge.fluids.FluidStack; import thedarkcolour.exnihiloreborn.recipe.CodecUtil; +import thedarkcolour.exnihiloreborn.recipe.EFinishedRecipe; import javax.annotation.Nullable; -public class FinishedCrucibleRecipe implements FinishedRecipe { +public class FinishedCrucibleRecipe implements EFinishedRecipe { private final ResourceLocation id; private final RecipeSerializer serializer; private final Ingredient ingredient; @@ -44,16 +45,4 @@ public class FinishedCrucibleRecipe implements FinishedRecipe { public RecipeSerializer getType() { return serializer; } - - @Nullable - @Override - public JsonObject serializeAdvancement() { - return null; - } - - @Nullable - @Override - public ResourceLocation getAdvancementId() { - return null; - } } diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/hammer/FinishedHammerRecipe.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/hammer/FinishedHammerRecipe.java index 5436abe2..a2593bc9 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/recipe/hammer/FinishedHammerRecipe.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/hammer/FinishedHammerRecipe.java @@ -1,41 +1,34 @@ package thedarkcolour.exnihiloreborn.recipe.hammer; -import com.google.common.collect.ImmutableList; -import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import net.minecraft.data.recipes.FinishedRecipe; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.RecipeSerializer; -import thedarkcolour.exnihiloreborn.recipe.CodecUtil; -import thedarkcolour.exnihiloreborn.recipe.Reward; +import net.minecraft.world.level.storage.loot.LootDataType; +import net.minecraft.world.level.storage.loot.providers.number.NumberProvider; +import net.minecraftforge.registries.ForgeRegistries; +import thedarkcolour.exnihiloreborn.recipe.EFinishedRecipe; +import thedarkcolour.exnihiloreborn.registry.ERecipeSerializers; -import javax.annotation.Nullable; - -public class FinishedHammerRecipe implements FinishedRecipe { +public class FinishedHammerRecipe implements EFinishedRecipe { private final ResourceLocation id; private final Ingredient ingredient; - private final ImmutableList rewards; - private final RecipeSerializer serializer; + private final Item result; + private final NumberProvider resultAmount; - public FinishedHammerRecipe(RecipeSerializer serializer, ResourceLocation id, Ingredient ingredient, ImmutableList rewards) { - this.serializer = serializer; + public FinishedHammerRecipe(ResourceLocation id, Ingredient ingredient, Item result, NumberProvider resultAmount) { this.id = id; this.ingredient = ingredient; - this.rewards = rewards; + this.result = result; + this.resultAmount = resultAmount; } @Override public void serializeRecipeData(JsonObject object) { object.add("ingredient", ingredient.toJson()); - - JsonArray rewardsJson = new JsonArray(); - - for (Reward reward : rewards) { - rewardsJson.add(CodecUtil.encode(Reward.CODEC, reward)); - } - - object.add("rewards", rewardsJson); + object.addProperty("result", ForgeRegistries.ITEMS.getKey(this.result).toString()); + object.add("result_amount", LootDataType.PREDICATE.parser().toJsonTree(resultAmount)); } @Override @@ -45,20 +38,6 @@ public class FinishedHammerRecipe implements FinishedRecipe { @Override public RecipeSerializer getType() { - return serializer; - } - - // We don't need an achievement cause this is basically a simplified loot table - - @Nullable - @Override - public JsonObject serializeAdvancement() { - return null; - } - - @Nullable - @Override - public ResourceLocation getAdvancementId() { - return null; + return ERecipeSerializers.HAMMER.get(); } } diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/hammer/HammerRecipe.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/hammer/HammerRecipe.java index ac19c43b..0723ab91 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/recipe/hammer/HammerRecipe.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/hammer/HammerRecipe.java @@ -1,18 +1,25 @@ package thedarkcolour.exnihiloreborn.recipe.hammer; -import com.google.common.collect.ImmutableList; +import com.google.gson.JsonObject; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.GsonHelper; +import net.minecraft.world.item.Item; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; -import thedarkcolour.exnihiloreborn.recipe.Reward; -import thedarkcolour.exnihiloreborn.recipe.RewardRecipe; +import net.minecraft.world.level.storage.loot.providers.number.NumberProvider; +import net.minecraftforge.registries.ForgeRegistries; +import org.jetbrains.annotations.Nullable; +import thedarkcolour.exnihiloreborn.recipe.ProbabilityRecipe; +import thedarkcolour.exnihiloreborn.recipe.RecipeUtil; import thedarkcolour.exnihiloreborn.registry.ERecipeSerializers; import thedarkcolour.exnihiloreborn.registry.ERecipeTypes; -public class HammerRecipe extends RewardRecipe { - public HammerRecipe(ResourceLocation id, Ingredient ingredient, ImmutableList rewards) { - super(id, ingredient, rewards); +public class HammerRecipe extends ProbabilityRecipe { + public HammerRecipe(ResourceLocation id, Ingredient ingredient, Item result, NumberProvider resultAmount) { + super(id, ingredient, result, resultAmount); } @Override @@ -24,4 +31,29 @@ public class HammerRecipe extends RewardRecipe { public RecipeType getType() { return ERecipeTypes.HAMMER.get(); } -} \ No newline at end of file + + public static class Serializer implements RecipeSerializer { + @Override + public HammerRecipe fromJson(ResourceLocation name, JsonObject json) { + Ingredient ingredient = RecipeUtil.readIngredient(json, "ingredient"); + Item result = RecipeUtil.readItem(json, "result"); + NumberProvider resultAmount = RecipeUtil.readNumberProvider(json, "result_amount"); + return new HammerRecipe(name, ingredient, result, resultAmount); + } + + @Override + public @Nullable HammerRecipe fromNetwork(ResourceLocation name, FriendlyByteBuf buffer) { + Ingredient ingredient = Ingredient.fromNetwork(buffer); + Item result = buffer.readById(BuiltInRegistries.ITEM); + NumberProvider resultAmount = RecipeUtil.fromNetworkNumberProvider(buffer); + return new HammerRecipe(name, ingredient, result, resultAmount); + } + + @Override + public void toNetwork(FriendlyByteBuf buffer, HammerRecipe recipe) { + recipe.getIngredient().toNetwork(buffer); + buffer.writeId(BuiltInRegistries.ITEM, recipe.result); + RecipeUtil.toNetworkNumberProvider(buffer, recipe.resultAmount); + } + } +} diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/sieve/FinishedSieveRecipe.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/sieve/FinishedSieveRecipe.java index e823e055..ae85e7e0 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/recipe/sieve/FinishedSieveRecipe.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/sieve/FinishedSieveRecipe.java @@ -1,46 +1,37 @@ package thedarkcolour.exnihiloreborn.recipe.sieve; -import com.google.common.collect.ImmutableList; -import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import net.minecraft.data.recipes.FinishedRecipe; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.RecipeSerializer; +import net.minecraft.world.level.storage.loot.LootDataType; +import net.minecraft.world.level.storage.loot.providers.number.NumberProvider; import net.minecraftforge.registries.ForgeRegistries; -import thedarkcolour.exnihiloreborn.recipe.CodecUtil; -import thedarkcolour.exnihiloreborn.recipe.Reward; +import thedarkcolour.exnihiloreborn.recipe.EFinishedRecipe; +import thedarkcolour.exnihiloreborn.registry.ERecipeSerializers; -import javax.annotation.Nullable; - -public class FinishedSieveRecipe implements FinishedRecipe { +public class FinishedSieveRecipe implements EFinishedRecipe { private final ResourceLocation id; - private final Item mesh; private final Ingredient ingredient; - private final ImmutableList rewards; - private final RecipeSerializer serializer; + private final Item mesh; + private final Item result; + private final NumberProvider resultAmount; - public FinishedSieveRecipe(RecipeSerializer serializer, ResourceLocation id, Item mesh, Ingredient ingredient, ImmutableList rewards) { - this.serializer = serializer; + public FinishedSieveRecipe(ResourceLocation id, Item mesh, Ingredient ingredient, Item result, NumberProvider resultAmount) { this.id = id; this.mesh = mesh; this.ingredient = ingredient; - this.rewards = rewards; + this.result = result; + this.resultAmount = resultAmount; } @Override public void serializeRecipeData(JsonObject object) { - object.addProperty("mesh", ForgeRegistries.ITEMS.getKey(mesh).toString()); object.add("ingredient", ingredient.toJson()); - - JsonArray rewardsJson = new JsonArray(); - - for (Reward reward : rewards) { - rewardsJson.add(CodecUtil.encode(Reward.CODEC, reward)); - } - - object.add("rewards", rewardsJson); + object.addProperty("mesh", ForgeRegistries.ITEMS.getKey(this.mesh).toString()); + object.addProperty("result", ForgeRegistries.ITEMS.getKey(this.result).toString()); + object.add("result_amount", LootDataType.PREDICATE.parser().toJsonTree(resultAmount)); } @Override @@ -50,20 +41,6 @@ public class FinishedSieveRecipe implements FinishedRecipe { @Override public RecipeSerializer getType() { - return serializer; - } - - // We don't need an achievement cause this is basically a simplified loot table - - @Nullable - @Override - public JsonObject serializeAdvancement() { - return null; - } - - @Nullable - @Override - public ResourceLocation getAdvancementId() { - return null; + return ERecipeSerializers.SIEVE.get(); } } diff --git a/src/main/java/thedarkcolour/exnihiloreborn/recipe/sieve/SieveRecipe.java b/src/main/java/thedarkcolour/exnihiloreborn/recipe/sieve/SieveRecipe.java index 1b069b5b..4ef9bbf3 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/recipe/sieve/SieveRecipe.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/recipe/sieve/SieveRecipe.java @@ -1,36 +1,27 @@ package thedarkcolour.exnihiloreborn.recipe.sieve; -import com.google.common.collect.ImmutableList; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import com.mojang.datafixers.util.Function4; +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.GsonHelper; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.RecipeSerializer; import net.minecraft.world.item.crafting.RecipeType; -import net.minecraft.world.level.storage.loot.LootPool; -import net.minecraft.world.level.storage.loot.LootTable; -import net.minecraftforge.registries.ForgeRegistries; -import thedarkcolour.exnihiloreborn.recipe.CodecUtil; -import thedarkcolour.exnihiloreborn.recipe.Reward; -import thedarkcolour.exnihiloreborn.recipe.RewardRecipe; -import thedarkcolour.exnihiloreborn.recipe.SingleIngredientRecipe; +import net.minecraft.world.level.storage.loot.providers.number.NumberProvider; +import org.jetbrains.annotations.Nullable; +import thedarkcolour.exnihiloreborn.recipe.ProbabilityRecipe; +import thedarkcolour.exnihiloreborn.recipe.RecipeUtil; import thedarkcolour.exnihiloreborn.registry.ERecipeSerializers; import thedarkcolour.exnihiloreborn.registry.ERecipeTypes; -import javax.annotation.Nullable; - -// in the future, this could be extended to have a heavy sieve recipe type -public class SieveRecipe extends RewardRecipe { +public class SieveRecipe extends ProbabilityRecipe { public final Item mesh; - public SieveRecipe(ResourceLocation id, Item mesh, Ingredient ingredient, ImmutableList rewards) { - super(id, ingredient, rewards); + public SieveRecipe(ResourceLocation id, Ingredient ingredient, Item mesh, Item result, NumberProvider resultAmount) { + super(id, ingredient, result, resultAmount); + this.mesh = mesh; } @@ -48,54 +39,31 @@ public class SieveRecipe extends RewardRecipe { return ERecipeTypes.SIEVE.get(); } - public static class Serializer implements RecipeSerializer { - private final Function4, T> factory; - - public Serializer(Function4, T> factory) { - this.factory = factory; + public static class Serializer implements RecipeSerializer { + @Override + public SieveRecipe fromJson(ResourceLocation id, JsonObject json) { + Ingredient ingredient = RecipeUtil.readIngredient(json, "ingredient"); + Item mesh = RecipeUtil.readItem(json, "mesh"); + Item result = RecipeUtil.readItem(json, "result"); + NumberProvider resultAmount = RecipeUtil.readNumberProvider(json, "result_amount"); + return new SieveRecipe(id, ingredient, mesh, result, resultAmount); } @Override - public T fromJson(ResourceLocation name, JsonObject json) { - Item mesh = ForgeRegistries.ITEMS.getValue(new ResourceLocation(GsonHelper.getAsString(json, "mesh"))); - Ingredient ingredient = readIngredient(json, "ingredient"); - - // Rewards must be a list - JsonArray rewardsJson = GsonHelper.getAsJsonArray(json, "rewards"); - ImmutableList.Builder rewards = ImmutableList.builder(); - - for (JsonElement element : rewardsJson) { - rewards.add(CodecUtil.decode(Reward.CODEC, element)); - } - - return factory.apply(name, mesh, ingredient, rewards.build()); - } - - @Nullable - @Override - public T fromNetwork(ResourceLocation name, FriendlyByteBuf buffer) { - var mesh = buffer.readRegistryIdUnsafe(ForgeRegistries.ITEMS); - var ingredient = Ingredient.fromNetwork(buffer); - var rewards = ImmutableList.builder(); - - for (int i = 0; i < buffer.readVarInt(); i++) { - rewards.add(Reward.fromNetwork(buffer)); - } - - return factory.apply(name, mesh, ingredient, rewards.build()); + public @Nullable SieveRecipe fromNetwork(ResourceLocation id, FriendlyByteBuf buffer) { + Ingredient ingredient = Ingredient.fromNetwork(buffer); + Item mesh = buffer.readById(BuiltInRegistries.ITEM); + Item result = buffer.readById(BuiltInRegistries.ITEM); + NumberProvider resultAmount = RecipeUtil.fromNetworkNumberProvider(buffer); + return new SieveRecipe(id, ingredient, mesh, result, resultAmount); } @Override - public void toNetwork(FriendlyByteBuf buffer, T recipe) { - buffer.writeRegistryIdUnsafe(ForgeRegistries.ITEMS, recipe.mesh); + public void toNetwork(FriendlyByteBuf buffer, SieveRecipe recipe) { recipe.getIngredient().toNetwork(buffer); - - var rewards = recipe.getRewards(); - buffer.writeVarInt(rewards.size()); - - for (Reward reward : rewards) { - reward.toNetwork(buffer); - } + buffer.writeId(BuiltInRegistries.ITEM, recipe.mesh); + buffer.writeId(BuiltInRegistries.ITEM, recipe.result); + RecipeUtil.toNetworkNumberProvider(buffer, recipe.resultAmount); } } } diff --git a/src/main/java/thedarkcolour/exnihiloreborn/registry/EBlocks.java b/src/main/java/thedarkcolour/exnihiloreborn/registry/EBlocks.java index 1afca901..aed58229 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/registry/EBlocks.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/registry/EBlocks.java @@ -27,14 +27,6 @@ public class EBlocks { public static final RegistryObject CRUSHED_NETHERRACK = BLOCKS.register("crushed_netherrack", () -> new Block(of().sound(SoundType.WOOL).strength(0.6f))); public static final RegistryObject CRUSHED_END_STONE = BLOCKS.register("crushed_end_stone", () -> new Block(of().sound(SoundType.WOOL).strength(0.6f))); - // Compressed Blocks - public static final RegistryObject COMPRESSED_COBBLESTONE = BLOCKS.register("compressed_cobblestone", () -> new Block(copy(Blocks.STONE))); - public static final RegistryObject COMPRESSED_DIRT = BLOCKS.register("compressed_dirt", () -> new Block(copy(Blocks.DIRT))); - public static final RegistryObject COMPRESSED_SAND = BLOCKS.register("compressed_sand", () -> new Block(copy(Blocks.SAND))); - public static final RegistryObject COMPRESSED_DUST = BLOCKS.register("compressed_dust", () -> new Block(copy(DUST.get()))); - public static final RegistryObject COMPRESSED_CRUSHED_NETHERRACK = BLOCKS.register("compressed_crushed_netherrack", () -> new Block(copy(CRUSHED_NETHERRACK.get()))); - public static final RegistryObject COMPRESSED_CRUSHED_END_STONE = BLOCKS.register("compressed_crushed_end_stone", () -> new Block(copy(CRUSHED_END_STONE.get()))); - // Barrels public static final RegistryObject OAK_BARREL = registerBarrel("oak_barrel", false, false); public static final RegistryObject SPRUCE_BARREL = registerBarrel("spruce_barrel", false, false); @@ -62,16 +54,6 @@ public class EBlocks { public static final RegistryObject CRIMSON_SIEVE = registerSieve("crimson_sieve"); public static final RegistryObject WARPED_SIEVE = registerSieve("warped_sieve"); - // Compressed Sieves - //public static final RegistryObject HEAVY_OAK_SIEVE = registerHeavySieve("heavy_oak_sieve", Material.WOOD); - //public static final RegistryObject HEAVY_SPRUCE_SIEVE = registerHeavySieve("heavy_spruce_sieve", Material.WOOD); - //public static final RegistryObject HEAVY_BIRCH_SIEVE = registerHeavySieve("heavy_birch_sieve", Material.WOOD); - //public static final RegistryObject HEAVY_JUNGLE_SIEVE = registerHeavySieve("heavy_jungle_sieve", Material.WOOD); - //public static final RegistryObject HEAVY_ACACIA_SIEVE = registerHeavySieve("heavy_acacia_sieve", Material.WOOD); - //public static final RegistryObject HEAVY_DARK_OAK_SIEVE = registerHeavySieve("heavy_dark_oak_sieve", Material.WOOD); - //public static final RegistryObject HEAVY_CRIMSON_SIEVE = registerHeavySieve("heavy_crimson_sieve", Material.NETHER_WOOD); - //public static final RegistryObject HEAVY_WARPED_SIEVE = registerHeavySieve("heavy_warped_sieve", Material.NETHER_WOOD); - // Lava Crucibles public static final RegistryObject PORCELAIN_CRUCIBLE = registerLavaCrucible("porcelain_crucible", false); public static final RegistryObject WARPED_CRUCIBLE = registerLavaCrucible("warped_crucible", true); diff --git a/src/main/java/thedarkcolour/exnihiloreborn/registry/EFluids.java b/src/main/java/thedarkcolour/exnihiloreborn/registry/EFluids.java index 365505b9..c860f9ec 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/registry/EFluids.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/registry/EFluids.java @@ -13,7 +13,7 @@ public class EFluids { public static final DeferredRegister FLUID_TYPES = DeferredRegister.create(ForgeRegistries.Keys.FLUID_TYPES, ExNihiloReborn.ID); public static final DeferredRegister FLUIDS = DeferredRegister.create(ForgeRegistries.FLUIDS, ExNihiloReborn.ID); - public static final RegistryObject WITCH_WATER = FLUID_TYPES.register("witch_water", WitchWaterFluid::new); + public static final RegistryObject WITCH_WATER_TYPE = FLUID_TYPES.register("witch_water", WitchWaterFluid::new); public static final RegistryObject WITCH_WATER_STILL = FLUIDS.register("witch_water", () -> new ForgeFlowingFluid.Source(WitchWaterFluid.properties())); public static final RegistryObject WITCH_WATER_FLOWING = FLUIDS.register("flowing_witch_water", () -> new ForgeFlowingFluid.Flowing(WitchWaterFluid.properties())); diff --git a/src/main/java/thedarkcolour/exnihiloreborn/registry/EItems.java b/src/main/java/thedarkcolour/exnihiloreborn/registry/EItems.java index 7587d2b2..25662198 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/registry/EItems.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/registry/EItems.java @@ -13,6 +13,7 @@ import net.minecraftforge.registries.RegistryObject; import thedarkcolour.exnihiloreborn.ExNihiloReborn; import thedarkcolour.exnihiloreborn.item.CrookItem; import thedarkcolour.exnihiloreborn.item.HammerItem; +import thedarkcolour.exnihiloreborn.item.MeshItem; import thedarkcolour.exnihiloreborn.item.PorcelainBucketItem; import thedarkcolour.exnihiloreborn.item.SilkWormItem; import thedarkcolour.exnihiloreborn.item.WitchWaterBucketItem; @@ -29,11 +30,12 @@ public class EItems { public static final RegistryObject BONE_CROOK = ITEMS.register("bone_crook", () -> new CrookItem(props().durability(312))); // Sieve Meshes - public static final RegistryObject STRING_MESH = ITEMS.register("string_mesh", () -> new Item(props().stacksTo(1))); - public static final RegistryObject FLINT_MESH = ITEMS.register("flint_mesh", () -> new Item(props().stacksTo(1))); - public static final RegistryObject IRON_MESH = ITEMS.register("iron_mesh", () -> new Item(props().stacksTo(1))); - public static final RegistryObject DIAMOND_MESH = ITEMS.register("diamond_mesh", () -> new Item(props().stacksTo(1))); - public static final RegistryObject NETHERITE_MESH = ITEMS.register("netherite_mesh", () -> new Item(props().stacksTo(1))); + public static final RegistryObject STRING_MESH = ITEMS.register("string_mesh", () -> new MeshItem(props().stacksTo(1))); + public static final RegistryObject FLINT_MESH = ITEMS.register("flint_mesh", () -> new MeshItem(props().stacksTo(1))); + public static final RegistryObject IRON_MESH = ITEMS.register("iron_mesh", () -> new MeshItem(props().stacksTo(1))); + public static final RegistryObject GOLDEN_MESH = ITEMS.register("golden_mesh", () -> new MeshItem(props().stacksTo(1))); + public static final RegistryObject DIAMOND_MESH = ITEMS.register("diamond_mesh", () -> new MeshItem(props().stacksTo(1))); + public static final RegistryObject NETHERITE_MESH = ITEMS.register("netherite_mesh", () -> new MeshItem(props().stacksTo(1))); // Hammers public static final RegistryObject WOODEN_HAMMER = ITEMS.register("wooden_hammer", () -> new HammerItem(Tiers.WOOD, props())); @@ -43,14 +45,18 @@ public class EItems { public static final RegistryObject DIAMOND_HAMMER = ITEMS.register("diamond_hammer", () -> new HammerItem(Tiers.DIAMOND, props())); public static final RegistryObject NETHERITE_HAMMER = ITEMS.register("netherite_hammer", () -> new HammerItem(Tiers.NETHERITE, props())); - // Ore Pieces todo re evaluate - public static final RegistryObject IRON_ORE_PIECES = registerSimpleItem("iron_ore_pieces"); - public static final RegistryObject COPPER_ORE_PIECES = registerSimpleItem("copper_ore_pieces"); - public static final RegistryObject GOLD_ORE_PIECES = registerSimpleItem("gold_ore_pieces"); + // Ore Chunks + public static final RegistryObject IRON_ORE_CHUNK = registerSimpleItem("iron_ore_chunk"); + public static final RegistryObject COPPER_ORE_CHUNK = registerSimpleItem("copper_ore_chunk"); + public static final RegistryObject GOLD_ORE_CHUNK = registerSimpleItem("gold_ore_chunk"); // Pebbles public static final RegistryObject STONE_PEBBLE = registerSimpleItem("stone_pebble"); + public static final RegistryObject DIORITE_PEBBLE = registerSimpleItem("diorite_pebble"); + public static final RegistryObject GRANITE_PEBBLE = registerSimpleItem("granite_pebble"); + public static final RegistryObject ANDESITE_PEBBLE = registerSimpleItem("andesite_pebble"); public static final RegistryObject DEEPSLATE_PEBBLE = registerSimpleItem("deepslate_pebble"); + public static final RegistryObject TUFF_PEBBLE = registerSimpleItem("tuff_pebble"); // Misc public static final RegistryObject PORCELAIN_CLAY = registerSimpleItem("porcelain_clay"); @@ -170,6 +176,7 @@ public class EItems { output.accept(STRING_MESH.get()); output.accept(FLINT_MESH.get()); output.accept(IRON_MESH.get()); + output.accept(GOLDEN_MESH.get()); output.accept(DIAMOND_MESH.get()); output.accept(NETHERITE_MESH.get()); output.accept(WOODEN_HAMMER.get()); @@ -178,10 +185,14 @@ public class EItems { output.accept(IRON_HAMMER.get()); output.accept(DIAMOND_HAMMER.get()); output.accept(NETHERITE_HAMMER.get()); - output.accept(IRON_ORE_PIECES.get()); - output.accept(COPPER_ORE_PIECES.get()); - output.accept(GOLD_ORE_PIECES.get()); + output.accept(IRON_ORE_CHUNK.get()); + output.accept(COPPER_ORE_CHUNK.get()); + output.accept(GOLD_ORE_CHUNK.get()); output.accept(STONE_PEBBLE.get()); + output.accept(DIORITE_PEBBLE.get()); + output.accept(GRANITE_PEBBLE.get()); + output.accept(ANDESITE_PEBBLE.get()); + output.accept(TUFF_PEBBLE.get()); output.accept(DEEPSLATE_PEBBLE.get()); output.accept(PORCELAIN_CLAY.get()); output.accept(PORCELAIN_BUCKET.get()); diff --git a/src/main/java/thedarkcolour/exnihiloreborn/registry/ERecipeSerializers.java b/src/main/java/thedarkcolour/exnihiloreborn/registry/ERecipeSerializers.java index 9e9cddf2..b5153fca 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/registry/ERecipeSerializers.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/registry/ERecipeSerializers.java @@ -5,8 +5,8 @@ import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.RegistryObject; import thedarkcolour.exnihiloreborn.ExNihiloReborn; -import thedarkcolour.exnihiloreborn.recipe.RewardRecipe; import thedarkcolour.exnihiloreborn.recipe.barrel.BarrelCompostRecipe; +import thedarkcolour.exnihiloreborn.recipe.barrel.BarrelMixingRecipe; import thedarkcolour.exnihiloreborn.recipe.crucible.CrucibleRecipe; import thedarkcolour.exnihiloreborn.recipe.hammer.HammerRecipe; import thedarkcolour.exnihiloreborn.recipe.sieve.SieveRecipe; @@ -15,11 +15,12 @@ public class ERecipeSerializers { public static final DeferredRegister> RECIPE_SERIALIZERS = DeferredRegister.create(ForgeRegistries.RECIPE_SERIALIZERS, ExNihiloReborn.ID); public static final RegistryObject> BARREL_COMPOST = RECIPE_SERIALIZERS.register("barrel_compost", BarrelCompostRecipe.Serializer::new); + public static final RegistryObject> BARREL_MIXING = RECIPE_SERIALIZERS.register("barrel_mixing", BarrelMixingRecipe.Serializer::new); - public static final RegistryObject> HAMMER = RECIPE_SERIALIZERS.register("hammer", () -> new RewardRecipe.Serializer<>(HammerRecipe::new)); + public static final RegistryObject> HAMMER = RECIPE_SERIALIZERS.register("hammer", HammerRecipe.Serializer::new); public static final RegistryObject> LAVA_CRUCIBLE = RECIPE_SERIALIZERS.register("lava_crucible", () -> new CrucibleRecipe.Serializer(ERecipeTypes.LAVA_CRUCIBLE.get())); public static final RegistryObject> WATER_CRUCIBLE = RECIPE_SERIALIZERS.register("water_crucible", () -> new CrucibleRecipe.Serializer(ERecipeTypes.WATER_CRUCIBLE.get())); - public static final RegistryObject> SIEVE = RECIPE_SERIALIZERS.register("sieve", () -> new SieveRecipe.Serializer<>(SieveRecipe::new)); + public static final RegistryObject> SIEVE = RECIPE_SERIALIZERS.register("sieve", SieveRecipe.Serializer::new); } diff --git a/src/main/java/thedarkcolour/exnihiloreborn/registry/ERecipeTypes.java b/src/main/java/thedarkcolour/exnihiloreborn/registry/ERecipeTypes.java index 8906dcc3..114c049f 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/registry/ERecipeTypes.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/registry/ERecipeTypes.java @@ -6,6 +6,7 @@ import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.RegistryObject; import thedarkcolour.exnihiloreborn.ExNihiloReborn; import thedarkcolour.exnihiloreborn.recipe.barrel.BarrelCompostRecipe; +import thedarkcolour.exnihiloreborn.recipe.barrel.BarrelMixingRecipe; import thedarkcolour.exnihiloreborn.recipe.crucible.CrucibleRecipe; import thedarkcolour.exnihiloreborn.recipe.hammer.HammerRecipe; import thedarkcolour.exnihiloreborn.recipe.sieve.SieveRecipe; @@ -14,6 +15,7 @@ public class ERecipeTypes { public static final DeferredRegister> RECIPE_TYPES = DeferredRegister.create(Registries.RECIPE_TYPE, ExNihiloReborn.ID); public static final RegistryObject> BARREL_COMPOST = RECIPE_TYPES.register("barrel_compost", () -> RecipeType.simple(ERecipeTypes.BARREL_COMPOST.getId())); + public static final RegistryObject> BARREL_MIXING = RECIPE_TYPES.register("barrel_mixing", () -> RecipeType.simple(ERecipeTypes.BARREL_MIXING.getId())); public static final RegistryObject> LAVA_CRUCIBLE = RECIPE_TYPES.register("lava_crucible", () -> RecipeType.simple(ERecipeTypes.LAVA_CRUCIBLE.getId())); public static final RegistryObject> WATER_CRUCIBLE = RECIPE_TYPES.register("water_crucible", () -> RecipeType.simple(ERecipeTypes.WATER_CRUCIBLE.getId())); diff --git a/src/main/java/thedarkcolour/exnihiloreborn/tag/EItemTags.java b/src/main/java/thedarkcolour/exnihiloreborn/tag/EItemTags.java index 855741b7..f3b50c5f 100644 --- a/src/main/java/thedarkcolour/exnihiloreborn/tag/EItemTags.java +++ b/src/main/java/thedarkcolour/exnihiloreborn/tag/EItemTags.java @@ -9,6 +9,9 @@ import thedarkcolour.exnihiloreborn.ExNihiloReborn; public class EItemTags { public static final TagKey CROOKS = tag("crooks"); public static final TagKey HAMMERS = tag("hammers"); + public static final TagKey SIEVE_MESHES = tag("sieve_meshes"); + public static final TagKey PEBBLES = tag("pebbles"); + public static final TagKey WOODEN_BARRELS = tag("wooden_barrels"); public static final TagKey STONE_BARRELS = tag("stone_barrels"); public static final TagKey BARRELS = tag("barrels"); diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 9be0d6cb..9ad1316b 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -3,3 +3,15 @@ public net.minecraft.client.renderer.texture.TextureAtlasSprite f_118349_ # x public net.minecraft.client.renderer.texture.TextureAtlasSprite f_118350_ # y public net.minecraft.client.renderer.texture.TextureAtlas f_276067_ # width public net.minecraft.client.renderer.texture.TextureAtlas f_276070_ # height +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.item.crafting.Ingredient$ItemValue f_43951_ # item +public net.minecraft.world.level.storage.loot.providers.number.ConstantValue f_165688_ # value +public net.minecraft.world.level.storage.loot.providers.number.UniformGenerator f_165774_ # min +public net.minecraft.world.level.storage.loot.providers.number.UniformGenerator f_165775_ # max +public net.minecraft.world.level.storage.loot.providers.number.UniformGenerator (Lnet/minecraft/world/level/storage/loot/providers/number/NumberProvider;Lnet/minecraft/world/level/storage/loot/providers/number/NumberProvider;)V # +public net.minecraft.world.level.storage.loot.providers.number.BinomialDistributionGenerator f_165653_ # n +public net.minecraft.world.level.storage.loot.providers.number.BinomialDistributionGenerator f_165654_ # p +public net.minecraft.world.level.storage.loot.providers.number.BinomialDistributionGenerator (Lnet/minecraft/world/level/storage/loot/providers/number/NumberProvider;Lnet/minecraft/world/level/storage/loot/providers/number/NumberProvider;)V # +public net.minecraft.client.multiplayer.ClientLevel f_104563_ # clientLevelData +public-f net.minecraft.client.multiplayer.ClientLevel$ClientLevelData f_104832_ # isFlat diff --git a/src/main/resources/assets/exnihiloreborn/models/block/sieve_with_mesh.bbmodel b/src/main/resources/assets/exnihiloreborn/models/block/sieve_with_mesh.bbmodel new file mode 100644 index 00000000..e962141e --- /dev/null +++ b/src/main/resources/assets/exnihiloreborn/models/block/sieve_with_mesh.bbmodel @@ -0,0 +1 @@ +{"meta":{"format_version":"4.5","model_format":"java_block","box_uv":false},"name":"template_sieve","parent":"minecraft:block/block","ambientocclusion":true,"front_gui_light":false,"visible_box":[1,1,0],"variable_placeholders":"","variable_placeholder_buttons":[],"unhandled_root_fields":{"name":"blockSieve"},"resolution":{"width":16,"height":16},"elements":[{"name":"cube","box_uv":false,"rescale":false,"locked":false,"from":[0,11,0],"to":[15,16,1],"autouv":2,"color":7,"origin":[0,0,0],"faces":{"north":{"uv":[1,0,16,5],"texture":0},"east":{"uv":[15,0,16,5],"texture":0},"south":{"uv":[0,0,15,5],"texture":0},"west":{"uv":[0,0,1,5],"texture":0},"up":{"uv":[0,0,15,1],"texture":0},"down":{"uv":[0,15,15,16],"texture":0}},"type":"cube","uuid":"a07a50ef-2901-ee2a-3ae6-698bc433e23a"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"from":[15,11,0],"to":[16,16,15],"autouv":2,"color":4,"origin":[0,0,0],"faces":{"north":{"uv":[0,0,1,5],"texture":0},"east":{"uv":[1,0,16,5],"texture":0},"south":{"uv":[15,0,16,5],"texture":0},"west":{"uv":[0,0,15,5],"texture":0},"up":{"uv":[15,0,16,15],"texture":0},"down":{"uv":[15,1,16,16],"texture":0}},"type":"cube","uuid":"023a6a12-6a78-27a2-8014-b9740d1c3b35"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"from":[1,11,15],"to":[16,16,16],"autouv":2,"color":8,"origin":[0,0,0],"faces":{"north":{"uv":[0,0,15,5],"texture":0},"east":{"uv":[0,0,1,5],"texture":0},"south":{"uv":[1,0,16,5],"texture":0},"west":{"uv":[15,0,16,5],"texture":0},"up":{"uv":[1,15,16,16],"texture":0},"down":{"uv":[1,0,16,1],"texture":0}},"type":"cube","uuid":"1d843e03-4214-a68d-a250-5a0208c27fdf"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"from":[0,11,1],"to":[1,16,16],"autouv":2,"color":4,"origin":[0,0,0],"faces":{"north":{"uv":[15,0,16,5],"texture":0},"east":{"uv":[0,0,15,5],"texture":0},"south":{"uv":[0,0,1,5],"texture":0},"west":{"uv":[1,0,16,5],"texture":0},"up":{"uv":[0,1,1,16],"texture":0},"down":{"uv":[0,0,1,15],"texture":0}},"type":"cube","uuid":"11f83424-1a84-af17-e8e0-3c650e5d7731"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"from":[1,0,1],"to":[2,16,2],"autouv":2,"color":9,"origin":[0,0,0],"faces":{"north":{"uv":[14,0,15,16],"texture":0},"east":{"uv":[14,0,15,16],"texture":0},"south":{"uv":[1,0,2,16],"texture":0},"west":{"uv":[1,0,2,16],"texture":0},"up":{"uv":[1,1,2,2],"texture":0},"down":{"uv":[1,14,2,15],"texture":0}},"type":"cube","uuid":"28b30204-ccb1-b3b7-3d22-b35efbc30489"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"from":[1,0,14],"to":[2,16,15],"autouv":2,"color":7,"origin":[0,0,0],"faces":{"north":{"uv":[14,0,15,16],"texture":0},"east":{"uv":[1,0,2,16],"texture":0},"south":{"uv":[1,0,2,16],"texture":0},"west":{"uv":[14,0,15,16],"texture":0},"up":{"uv":[1,14,2,15],"texture":0},"down":{"uv":[1,1,2,2],"texture":0}},"type":"cube","uuid":"cc6e5a7a-e76d-e6ed-423d-91c21b6528da"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"from":[14,0,1],"to":[15,16,2],"autouv":2,"color":2,"origin":[0,0,0],"faces":{"north":{"uv":[1,0,2,16],"texture":0},"east":{"uv":[14,0,15,16],"texture":0},"south":{"uv":[14,0,15,16],"texture":0},"west":{"uv":[1,0,2,16],"texture":0},"up":{"uv":[14,1,15,2],"texture":0},"down":{"uv":[14,14,15,15],"texture":0}},"type":"cube","uuid":"21c7cbd8-dfc5-d28c-2639-96eecb5458c4"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"from":[14,0,14],"to":[15,16,15],"autouv":2,"color":3,"origin":[0,0,0],"faces":{"north":{"uv":[1,0,2,16],"texture":0},"east":{"uv":[1,0,2,16],"texture":0},"south":{"uv":[14,0,15,16],"texture":0},"west":{"uv":[14,0,15,16],"texture":0},"up":{"uv":[14,14,15,15],"texture":0},"down":{"uv":[14,1,15,2],"texture":0}},"type":"cube","uuid":"fe8c5e78-e609-7006-8bbf-ad3ae064503e"},{"name":"cube","box_uv":false,"rescale":false,"locked":false,"from":[1,12,1],"to":[15,12,15],"autouv":0,"color":2,"origin":[0,0,0],"faces":{"north":{"uv":[0,0,14,0]},"east":{"uv":[0,0,14,0]},"south":{"uv":[0,0,14,0]},"west":{"uv":[0,0,14,0]},"up":{"uv":[1,1,15,15],"texture":1},"down":{"uv":[1,1,15,15],"texture":1}},"type":"cube","uuid":"bab68742-609b-683d-790c-d4aca68a82ef"}],"outliner":["a07a50ef-2901-ee2a-3ae6-698bc433e23a","023a6a12-6a78-27a2-8014-b9740d1c3b35","1d843e03-4214-a68d-a250-5a0208c27fdf","11f83424-1a84-af17-e8e0-3c650e5d7731","28b30204-ccb1-b3b7-3d22-b35efbc30489","cc6e5a7a-e76d-e6ed-423d-91c21b6528da","21c7cbd8-dfc5-d28c-2639-96eecb5458c4","fe8c5e78-e609-7006-8bbf-ad3ae064503e","bab68742-609b-683d-790c-d4aca68a82ef"],"textures":[{"path":"","name":"texture","folder":"block","namespace":"","id":"0","particle":true,"render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"mode":"bitmap","saved":false,"uuid":"7b864ed0-3f30-e0b4-e77e-b52f341fad3e","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAABaUlEQVQ4jW1SwWoCMRB9YhZM1paQVjQURPRU2FMPPfQfCt578OgP+TH+jCKCRFGXoG6ysAg9jA6L7RwC8zKZeS9vGvPZJFZBJkrJJmoR4vUvslytBQCZqFiFWMFtDlK3ddqSiaKKWAUqAOB8LnVbUHuC7NsrPXY+58Y6bVGN1Wa5Wgu3OWzzAKBnFIBtHnZ5AaBrUgC7vOialJFdXojhoJ+9NxduP7IdABkAgNM6MV+UXx9GxCoAympzPJ19Ueq05Ysy+ssC0GmLBBBhqVWsgvBF6VHehKZ30v5itaEJ3J7SxnScMeOeUayBgvD6VWM+m9B/M9eX5yf8FyFenc8FgOPpfGOZKEqZAEmiE0D0F6FkE1APRHFXzG8AWG1cXcODDwySSwyKn+/PhdtbbUjJMF5pC9gH6fYj2+HVEsfTmaaTJiZDXSil/4gVAAiiTlZYbWIVyLjhoE8m0C1ra0zHGa9NXQzr4V2i+AWEBPpHdzxCEQAAAABJRU5ErkJggg=="},{"path":"C:\\Things\\mods\\texture\\string_mesh.png","name":"string_mesh.png","folder":"Things/mods/texture","namespace":"","id":"1","particle":false,"render_mode":"default","render_sides":"auto","frame_time":1,"frame_order_type":"loop","frame_order":"","frame_interpolate":false,"visible":true,"mode":"bitmap","saved":true,"uuid":"7de5528c-1b0d-d9b6-dd22-bc979743794c","relative_path":"../../../../../../../../../../../../../../Things/mods/texture/string_mesh.png","source":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAFRJREFUWEftk7ENACAMw8j/RxcVgcQF9WIW6FTjKFn3VFUlSY+T77Nweun/wfTwIIibN2AEuAEcwBYYAW4AB7AFRoAbwAFsgRHgBnAAW2AEuAEaYAOjfJgmWzi3DQAAAABJRU5ErkJggg=="}]} \ No newline at end of file diff --git a/src/main/resources/assets/exnihiloreborn/textures/block/compost_dirt.png b/src/main/resources/assets/exnihiloreborn/textures/block/compost_dirt.png index 5a2e9c49..94a8e294 100644 Binary files a/src/main/resources/assets/exnihiloreborn/textures/block/compost_dirt.png and b/src/main/resources/assets/exnihiloreborn/textures/block/compost_dirt.png differ diff --git a/src/main/resources/assets/exnihiloreborn/textures/gui/jei/enr_jei.png b/src/main/resources/assets/exnihiloreborn/textures/gui/jei/enr_jei.png new file mode 100644 index 00000000..1fc93b3d Binary files /dev/null and b/src/main/resources/assets/exnihiloreborn/textures/gui/jei/enr_jei.png differ diff --git a/src/main/resources/assets/exnihiloreborn/textures/item/andesite_pebble.png b/src/main/resources/assets/exnihiloreborn/textures/item/andesite_pebble.png new file mode 100644 index 00000000..279bd08e Binary files /dev/null and b/src/main/resources/assets/exnihiloreborn/textures/item/andesite_pebble.png differ diff --git a/src/main/resources/assets/exnihiloreborn/textures/item/deepslate_pebble.png b/src/main/resources/assets/exnihiloreborn/textures/item/deepslate_pebble.png new file mode 100644 index 00000000..cbc066d8 Binary files /dev/null and b/src/main/resources/assets/exnihiloreborn/textures/item/deepslate_pebble.png differ diff --git a/src/main/resources/assets/exnihiloreborn/textures/item/diorite_pebble.png b/src/main/resources/assets/exnihiloreborn/textures/item/diorite_pebble.png new file mode 100644 index 00000000..8e2b14ec Binary files /dev/null and b/src/main/resources/assets/exnihiloreborn/textures/item/diorite_pebble.png differ diff --git a/src/main/resources/assets/exnihiloreborn/textures/item/granite_pebble.png b/src/main/resources/assets/exnihiloreborn/textures/item/granite_pebble.png new file mode 100644 index 00000000..cf2eba9b Binary files /dev/null and b/src/main/resources/assets/exnihiloreborn/textures/item/granite_pebble.png differ diff --git a/src/main/resources/assets/exnihiloreborn/textures/item/mesh/diamond_mesh.png b/src/main/resources/assets/exnihiloreborn/textures/item/mesh/diamond_mesh.png new file mode 100644 index 00000000..73b9e884 Binary files /dev/null and b/src/main/resources/assets/exnihiloreborn/textures/item/mesh/diamond_mesh.png differ diff --git a/src/main/resources/assets/exnihiloreborn/textures/item/mesh/flint_mesh.png b/src/main/resources/assets/exnihiloreborn/textures/item/mesh/flint_mesh.png new file mode 100644 index 00000000..73b9e884 Binary files /dev/null and b/src/main/resources/assets/exnihiloreborn/textures/item/mesh/flint_mesh.png differ diff --git a/src/main/resources/assets/exnihiloreborn/textures/item/mesh/golden_mesh.png b/src/main/resources/assets/exnihiloreborn/textures/item/mesh/golden_mesh.png new file mode 100644 index 00000000..73b9e884 Binary files /dev/null and b/src/main/resources/assets/exnihiloreborn/textures/item/mesh/golden_mesh.png differ diff --git a/src/main/resources/assets/exnihiloreborn/textures/item/mesh/iron_mesh.png b/src/main/resources/assets/exnihiloreborn/textures/item/mesh/iron_mesh.png new file mode 100644 index 00000000..73b9e884 Binary files /dev/null and b/src/main/resources/assets/exnihiloreborn/textures/item/mesh/iron_mesh.png differ diff --git a/src/main/resources/assets/exnihiloreborn/textures/item/mesh/netherite_mesh.png b/src/main/resources/assets/exnihiloreborn/textures/item/mesh/netherite_mesh.png new file mode 100644 index 00000000..73b9e884 Binary files /dev/null and b/src/main/resources/assets/exnihiloreborn/textures/item/mesh/netherite_mesh.png differ diff --git a/src/main/resources/assets/exnihiloreborn/textures/item/mesh/string_mesh.png b/src/main/resources/assets/exnihiloreborn/textures/item/mesh/string_mesh.png new file mode 100644 index 00000000..73b9e884 Binary files /dev/null and b/src/main/resources/assets/exnihiloreborn/textures/item/mesh/string_mesh.png differ diff --git a/src/main/resources/assets/exnihiloreborn/textures/item/stone_pebble.png b/src/main/resources/assets/exnihiloreborn/textures/item/stone_pebble.png new file mode 100644 index 00000000..8cf356f7 Binary files /dev/null and b/src/main/resources/assets/exnihiloreborn/textures/item/stone_pebble.png differ diff --git a/src/main/resources/assets/exnihiloreborn/textures/item/string_mesh.png b/src/main/resources/assets/exnihiloreborn/textures/item/string_mesh.png new file mode 100644 index 00000000..7377539f Binary files /dev/null and b/src/main/resources/assets/exnihiloreborn/textures/item/string_mesh.png differ diff --git a/src/main/resources/vanilla_compost_colors.txt b/src/main/resources/vanilla_compost_colors.txt index 90e96457..7c9be21e 100644 --- a/src/main/resources/vanilla_compost_colors.txt +++ b/src/main/resources/vanilla_compost_colors.txt @@ -1,1254 +1,1254 @@ -jungle_sapling, #437316 -blackstone, #3c3239 -spruce_planks, #a27844 -stripped_bamboo_block, #fff772 -target, #fffbf0 -stripped_mangrove_log, #aa4d43 -enchanting_table, #150e22 -oak_sapling, #6e9739 -waxed_copper_block, #ff9870 -oak_log, #9b7947 -mud_bricks, #c39370 -crimson_nylium, #982525 -yellow_stained_glass_pane, #ffff48 -stripped_acacia_wood, #f88354 -rib_armor_trim_smithing_template, #433c47 -waxed_oxidized_cut_copper_stairs, #70dab4 -lime_glazed_terracotta, #e7ff4e -sponge, #ffff69 -fire_charge, #835e3a -hopper_minecart, #737679 -black_bed, #1c1e23 -cauldron, #555458 -player_head, #735847 -vine, #a5a5a5 -birch_door, #ffffe6 -skull_banner_pattern, #fffff1 -brick_wall, #d68a76 -crafting_table, #b89664 -cracked_polished_blackstone_bricks, #3e343d -smooth_stone, #e1e1e1 -shelter_pottery_sherd, #985446 -polished_blackstone_button, #4b4450 -cut_copper_stairs, #ff9772 -blade_pottery_sherd, #9d5747 -black_banner, #e7b96f -lava_bucket, #d4b69e -sugar_cane, #79cf32 -deepslate_copper_ore, #83847f -cooked_chicken, #fca069 -exposed_cut_copper, #dcac90 -farmland, #bf895f -scaffolding, #fecc80 -bamboo_fence_gate, #ffff78 -book, #80643a -black_glazed_terracotta, #5f2a2d -music_disc_otherside, #4a5552 -clock, #fccc5a -dragon_head, #735847 -magenta_candle, #e647d9 -deepslate_brick_stairs, #646465 -warped_nylium, #665754 -honey_bottle, #ffdab1 -ice, #cfffff -warped_button, #3d948d -horn_coral_block, #ffff5e -suspicious_gravel, #b8b2b1 -magenta_stained_glass_pane, #fe6cff -creeper_banner_pattern, #fffff1 -cobweb, #ffffff -polished_diorite, #ffffff -bamboo_button, #fff772 -deepslate_coal_ore, #69696c -dark_oak_hanging_sign, #705232 -ender_chest, #150e22 -turtle_egg, #e8f1c2 -cornflower, #ffffff -music_disc_5, #445c62 -flower_banner_pattern, #fffff1 -torchflower, #8e906e -zoglin_spawn_egg, #f7ffff -bamboo_fence, #b100b1 -brown_concrete_powder, #b2784b -elytra, #868691 -cherry_chest_boat, #e8a78c -infested_chiseled_stone_bricks, #aaa8aa -gray_stained_glass, #6c6c6c -sculk_catalyst, #6c8480 -cracked_deepslate_tiles, #4a4a4a -vex_armor_trim_smithing_template, #708989 -nether_wart, #a42630 -stone_hoe, #6e6147 -decorated_pot, #b86654 -polished_deepslate_wall, #666668 -spruce_leaves, #b4b4b4 -cod_bucket, #b8afaf -red_banner, #e7b96f -gunpowder, #767676 -netherite_ingot, #585152 -waxed_oxidized_copper, #75e7bc -purple_bed, #ac3cf5 -heavy_weighted_pressure_plate, #ffffff -tropical_fish_spawn_egg, #f7ffff -polished_blackstone_wall, #4b4450 -tinted_glass, #3d3640 -oak_fence, #e7b96f -nether_gold_ore, #a44d3c -light_gray_stained_glass_pane, #dadada -black_stained_glass, #232323 -blaze_spawn_egg, #f7ffff -melon_seeds, #514420 -dark_oak_trapdoor, #6b4620 -diamond_ore, #acc9c8 -red_nether_brick_slab, #620a0c -green_stained_glass, #91b548 -jukebox, #7d5239 -popped_chorus_fruit, #ae73ae -orange_concrete_powder, #ffbb2c -lapis_lazuli, #3a75ee -birch_log, #ffffff -mossy_stone_brick_slab, #a4ac96 -wolf_spawn_egg, #f7ffff -stone_pickaxe, #6f624b -warped_stem, #52526e -tipped_arrow, #f4f4f4 -salmon, #8a6258 -quartz_slab, #ffffff -gray_wool, #586165 -quartz, #fff5e6 -purple_terracotta, #a8647a -music_disc_chirp, #574143 -chest_minecart, #8e7f61 -bread, #c59029 -music_disc_cat, #4a5c41 -light_gray_terracotta, #c0978a -gray_stained_glass_pane, #6c6c6c -moss_carpet, #7f9b40 -chiseled_quartz_block, #ffffff -brush, #edb48c -cyan_terracotta, #7a8282 -jungle_sign, #b58252 -jungle_hanging_sign, #b4845e -lever, #9e845f -infested_stone_bricks, #aeacae -magenta_concrete, #f144e3 -zombie_head, #735847 -dead_brain_coral_block, #b1a7a2 -brewer_pottery_sherd, #985444 -name_tag, #ebddb4 -cracked_stone_bricks, #a8a7a8 -chiseled_red_sandstone, #ff8926 -crossbow, #786151 -brown_carpet, #a26539 -dead_fire_coral_fan, #f2edea -reinforced_deepslate, #919b8e -golden_hoe, #9d7d28 -music_disc_strad, #616161 -orange_terracotta, #e67634 -dried_kelp_block, #364429 -purple_carpet, #ac3cf5 -iron_helmet, #828282 -netherite_leggings, #4a4143 -acacia_door, #e88755 -hanging_roots, #e6a482 -honeycomb_block, #ffd329 -spire_armor_trim_smithing_template, #d0a0e3 -netherite_shovel, #644a52 -black_shulker_box, #232329 -hay_block, #edc236 -mangrove_wood, #765e3a -green_bed, #789b26 -orange_stained_glass_pane, #ffb548 -birch_fence, #fffaac -white_bed, #ffffff -terracotta, #d9865f -sandstone_wall, #ffffdd -redstone_block, #fa2207 -brown_terracotta, #6e4832 -heart_pottery_sherd, #915141 -black_terracotta, #341f16 -emerald_block, #3cff7c -lightning_rod, #ff9e76 -vex_spawn_egg, #f7ffff -iron_axe, #9b9079 -lectern, #d4a75f -wooden_hoe, #694e1e -potion, #e8e8e8 -bamboo_planks, #fff772 -dark_oak_planks, #5e3d1c -spider_eye, #8a1839 -nether_wart_block, #a20404 -mossy_cobblestone_slab, #9da886 -mangrove_leaves, #b8b6b6 -stripped_acacia_log, #f88354 -mangrove_trapdoor, #9d413c -pink_terracotta, #e66f6f -note_block, #7d5239 -light_blue_stained_glass_pane, #91daff -blue_concrete, #3e41cc -polished_blackstone_slab, #4b4450 -cherry_door, #ffeee6 -chainmail_chestplate, #b1b1b1 -mossy_stone_bricks, #a4ac96 -dead_fire_coral_block, #bbafaa -pink_wool, #ffc9f5 -oak_button, #e7b96f -cherry_sapling, #eaa7cc -coal_block, #161515 -light_gray_concrete_powder, #dcdcd3 -spruce_sign, #835e33 -skeleton_horse_spawn_egg, #f7ffff -leather_leggings, #9e9e9e -polished_blackstone_bricks, #443c46 -mud_brick_stairs, #c39370 -apple, #fa292c -pink_stained_glass, #ffb5eb -cherry_pressure_plate, #fffef5 -warped_planks, #3d948d -mossy_stone_brick_wall, #a4ac96 -white_carpet, #ffffff -polished_deepslate_stairs, #666668 -dark_oak_sapling, #57802a -red_wool, #e43730 -white_tulip, #91ea72 -slime_spawn_egg, #f7ffff -copper_ore, #b1b2ab -bundle, #a45b30 -diorite_stairs, #ffffff -salmon_spawn_egg, #f7ffff -light_gray_dye, #d9d9ea -pink_candle, #ffa0d3 -crimson_slab, #904464 -stone_sword, #7c7973 -gold_ore, #cfbe97 -cyan_shulker_box, #1cacc0 -brown_dye, #9a521f -amethyst_cluster, #e8b4ff -smooth_red_sandstone, #ff8a2c -smooth_quartz_stairs, #ffffff -orange_tulip, #a0d262 -furnace_minecart, #787a7a -creeper_spawn_egg, #f7ffff -dead_horn_coral, #cac0b8 -bookshelf, #a78654 -wheat, #c8ae5f -calcite, #ffffff -iron_nugget, #abb6c0 -white_terracotta, #fffee6 -blaze_powder, #ff8e15 -magenta_concrete_powder, #ff76ff -end_crystal, #ffcfff -iron_ore, #c2b8ae -verdant_froglight, #ffffff -netherite_boots, #463d40 -music_disc_mall, #524d61 -cooked_mutton, #a5624a -acacia_stairs, #f08047 -crimson_fungus, #c93e29 -blue_carpet, #4b51e0 -yellow_concrete, #fffa1e -mangrove_fence, #a74d44 -allium, #cfcaff -warped_door, #43c0b9 -polished_andesite, #bcbfbe -vindicator_spawn_egg, #f7ffff -goat_horn, #6f6c68 -pumpkin_pie, #ffc86e -light_blue_concrete_powder, #69ffff -yellow_candle, #fff150 -skeleton_spawn_egg, #f7ffff -bone, #ffffff -ladder, #b1894d -bamboo_pressure_plate, #fff772 -sea_pickle, #ffffff -green_banner, #e7b96f -bone_block, #ffffff -yellow_stained_glass, #ffff48 -wither_skeleton_skull, #735847 -amethyst_block, #be8aff -villager_spawn_egg, #f7ffff -pufferfish_spawn_egg, #f7ffff -deepslate_tiles, #4d4d4e -golden_shovel, #b99e39 -bamboo_chest_raft, #a0843c -light_blue_glazed_terracotta, #86eaff -deepslate_brick_slab, #646465 -rail, #b29e7d -jungle_planks, #e4a472 -cyan_dye, #3297c2 -birch_button, #fffaac -tall_grass, #d7d4d7 -stripped_oak_wood, #fccd7a -red_nether_brick_wall, #620a0c -zombie_spawn_egg, #f7ffff -deepslate_bricks, #646465 -raw_copper_block, #dc9670 -mule_spawn_egg, #f7ffff -pufferfish_bucket, #c2b9a1 -anvil, #616161 -friend_pottery_sherd, #965444 -poisonous_potato, #c8b94d -diamond_sword, #379883 -smooth_sandstone_slab, #fffff2 -beacon, #c8d4d7 -heart_of_the_sea, #1f90bb -cooked_salmon, #986e4b -pink_petals, #fffbff -green_candle, #70971e -enchanted_golden_apple, #ffc839 -smooth_quartz, #ffffff -white_stained_glass_pane, #ffffff -spruce_pressure_plate, #a27844 -azalea, #829b3c -gray_concrete_powder, #6c7378 -lapis_block, #2a5fc8 -cocoa_beans, #7a4a26 -sunflower, #ffff4d -dragon_breath, #ffe4ff -cyan_candle, #18b9bb -end_stone_brick_wall, #ffffe7 -acacia_hanging_sign, #b96c40 -oak_stairs, #e7b96f -feather, #ffffff -netherite_sword, #624754 -oxidized_cut_copper, #70dab4 -oak_trapdoor, #b18d50 -gold_ingot, #ffff5e -bucket, #aaaaaa -wayfinder_armor_trim_smithing_template, #7a6f62 -jungle_trapdoor, #d99d6e -white_glazed_terracotta, #ffffff -quartz_stairs, #ffffff -green_terracotta, #6c763c -flower_pot, #964e3c -emerald_ore, #9ac2a4 -polished_deepslate_slab, #666668 -orange_stained_glass, #ffb548 -weeping_vines, #bc1611 -stripped_crimson_stem, #c35180 -enderman_spawn_egg, #f7ffff -deepslate_tile_slab, #4d4d4e -stone_stairs, #b2b2b2 -red_tulip, #84b534 -plenty_pottery_sherd, #935143 -sandstone, #ffffdd -orange_shulker_box, #ff970b -brown_bed, #a26539 -stone_pressure_plate, #b2b2b2 -bubble_coral, #e620e3 -ink_sac, #685f78 -snout_armor_trim_smithing_template, #505762 -prize_pottery_sherd, #975444 -stripped_spruce_log, #a47f4a -phantom_spawn_egg, #f7ffff -command_block, #f7bb97 -brick_stairs, #d68a76 -muddy_mangrove_roots, #615244 -weathered_cut_copper, #9bcf98 -piston, #9b9489 -light_gray_glazed_terracotta, #cdedee -lily_pad, #bebebe -clay_ball, #a4aec6 -cat_spawn_egg, #f7ffff -glowstone, #f4bb78 -sticky_piston, #9b9489 -saddle, #cc612d -quartz_pillar, #ffffff -ocelot_spawn_egg, #f7ffff -beetroot_seeds, #bf9b65 -carved_pumpkin, #d67818 -cherry_button, #fffef5 -prismarine_wall, #91dcd9 -shulker_shell, #a06ba7 -dark_oak_button, #5e3d1c -green_concrete, #688233 -yellow_wool, #ffff37 -cooked_rabbit, #f2a472 -light_blue_concrete, #32c3ff -jungle_chest_boat, #976c41 -waxed_cut_copper_stairs, #ff9772 -smooth_red_sandstone_slab, #ff8a2c -brewing_stand, #a89670 -torch, #c5a15a -packed_mud, #ca9770 -dark_oak_fence, #5e3d1c -cherry_log, #4d2f3e -wild_armor_trim_smithing_template, #8ca896 -wet_sponge, #f4ff64 -red_sand, #ff912f -birch_boat, #d2bc82 -exposed_cut_copper_stairs, #dcac90 -green_wool, #789b26 -crimson_pressure_plate, #904464 -waxed_weathered_cut_copper_stairs, #9bcf98 -cod, #eab583 -stripped_dark_oak_wood, #665033 -beef, #ff5448 -wither_rose, #39471f -gold_nugget, #ffd95b -jigsaw, #726273 -black_candle, #3d3a5c -blue_concrete_powder, #6468ed -mangrove_pressure_plate, #a74d44 -end_portal_frame, #d6e8ae -red_stained_glass, #da4848 -brown_wool, #a26539 -polished_granite_slab, #dc977f -chorus_plant, #845184 -black_concrete, #b0e15 -cod_spawn_egg, #f7ffff -acacia_fence_gate, #f08047 -gray_dye, #9e9e9e -iron_golem_spawn_egg, #f7ffff -birch_leaves, #b9b8b9 -bamboo_door, #fff470 -fern, #ffffff -globe_banner_pattern, #fffff1 -red_nether_brick_stairs, #620a0c -emerald, #40ed70 -brown_mushroom, #daa583 -cake, #ffeecc -command_block_minecart, #968475 -mangrove_log, #765e3a -purple_candle, #9e32e8 -nether_star, #daf7e0 -loom, #d3a875 -red_terracotta, #cc5741 -copper_block, #ff9870 -oak_slab, #e7b96f -magma_cream, #f2c051 -dirt_path, #bf895f -bat_spawn_egg, #f7ffff -stone_button, #b2b2b2 -repeating_command_block, #b69bee -polished_granite, #dc977f -chorus_fruit, #b484b2 -spruce_button, #a27844 -leather_boots, #b4b4b4 -wooden_shovel, #755720 -waxed_cut_copper_slab, #ff9772 -tnt, #ff7d78 -oxidized_cut_copper_slab, #70dab4 -cow_spawn_egg, #f7ffff -music_disc_relic, #98695f -yellow_carpet, #ffff37 -cyan_concrete, #1eaac2 -glass_pane, #c8d4d7 -mutton, #ff5a50 -lime_terracotta, #93a74a -light_weighted_pressure_plate, #ffff57 -cooked_cod, #ffffff -warped_slab, #3d948d -debug_stick, #6c5a37 -snow, #ffffff -mossy_cobblestone_wall, #9da886 -soul_sand, #735847 -mangrove_roots, #6b5436 -cyan_concrete_powder, #33d2e0 -enchanted_book, #905e3a -birch_hanging_sign, #d0bc83 -bamboo_sign, #f8dd68 -sweet_berries, #7a3228 -trident, #aed2c8 -netherite_scrap, #72473c -sugar, #ffffff -end_stone_brick_stairs, #ffffe7 -stripped_dark_oak_log, #665033 -dark_oak_chest_boat, #704d22 -fire_coral_block, #e83241 -danger_pottery_sherd, #9a5546 -repeater, #b28070 -purpur_stairs, #f1b2f1 -heartbreak_pottery_sherd, #965244 -magenta_terracotta, #d47d9a -white_concrete_powder, #ffffff -cherry_hanging_sign, #ffafb4 -cut_sandstone_slab, #ffffe3 -bamboo_hanging_sign, #e6cf6b -nether_brick_wall, #3e1e25 -soul_soil, #6b5141 -cherry_planks, #fffef5 -chicken, #ffe0c6 -weathered_cut_copper_slab, #9bcf98 -jungle_slab, #e4a472 -cherry_sign, #ffc9c5 -powder_snow_bucket, #cfe3e6 -mangrove_planks, #a74d44 -bone_meal, #e1e1ff -small_amethyst_bud, #bb8dff -splash_potion, #e8e8e8 -black_stained_glass_pane, #232323 -acacia_boat, #ac5e34 -tropical_fish, #ff8c4b -sheep_spawn_egg, #f7ffff -wither_skeleton_spawn_egg, #f7ffff -warped_wart_block, #1faaac -spruce_fence, #a27844 -goat_spawn_egg, #f7ffff -nether_sprouts, #1bd7be -burn_pottery_sherd, #9b5747 -frogspawn, #9d877a -fishing_rod, #7d7057 -stripped_cherry_log, #ffcfd3 -brown_banner, #e7b96f -dead_bubble_coral, #bcb1ab -stripped_jungle_wood, #f4bc78 -ancient_debris, #875a4e -piglin_head, #735847 -angler_pottery_sherd, #9d5747 -crimson_fence, #904464 -mangrove_fence_gate, #a74d44 -bee_nest, #ffd66e -detector_rail, #af9480 -oak_sign, #cda45f -golden_pickaxe, #a48326 -prismarine_crystals, #c9f8e7 -magma_cube_spawn_egg, #f7ffff -cherry_stairs, #fffef5 -nether_brick_stairs, #3e1e25 -horn_coral_fan, #ffff57 -slime_block, #9eff82 -polished_blackstone, #4b4450 -tropical_fish_bucket, #c5a7a4 -orange_banner, #e7b96f -netherite_upgrade_smithing_template, #835154 -minecart, #646e73 -bamboo_mosaic, #fff26f -lodestone, #aaaaaf -wooden_axe, #70541f -polished_blackstone_brick_wall, #443c46 -diorite, #ffffff -cherry_wood, #4d2f3e -cobblestone_slab, #b5b5b5 -gold_block, #ffff57 -mangrove_slab, #a74d44 -stripped_crimson_hyphae, #c35180 -disc_fragment_5, #3d5458 -rabbit_foot, #e8b67d -dark_oak_pressure_plate, #5e3d1c -prismarine_stairs, #91dcd9 -chipped_anvil, #616161 -oak_boat, #a28352 -blue_terracotta, #695482 -mangrove_hanging_sign, #8d4843 -horn_coral, #ffff58 -armor_stand, #a18457 -snowball, #ffffff -acacia_button, #f08047 -exposed_cut_copper_slab, #dcac90 -prismarine_shard, #9ae8d0 -nether_quartz_ore, #a75c58 -warped_hyphae, #52526e -acacia_fence, #f08047 -cobblestone, #b5b5b5 -acacia_chest_boat, #a16232 -waxed_oxidized_cut_copper_slab, #70dab4 -snow_block, #ffffff -oxeye_daisy, #ccffa1 -spore_blossom, #ff89e1 -potato, #feb648 -evoker_spawn_egg, #f7ffff -iron_ingot, #dedede -wither_spawn_egg, #f7ffff -structure_void, #227a84 -crying_obsidian, #2d0e55 -fermented_spider_eye, #931637 -glow_squid_spawn_egg, #f7ffff -infested_cobblestone, #b5b5b5 -orange_glazed_terracotta, #dcd282 -diamond_helmet, #32a798 -cyan_bed, #1ec3cf -end_stone, #ffffe1 -glowstone_dust, #ffb261 -flowering_azalea, #829b3c -water_bucket, #9ea8c5 -iron_bars, #c2c6c0 -chain_command_block, #b8decd -wheat_seeds, #57bf26 -ender_dragon_spawn_egg, #f7ffff -guardian_spawn_egg, #f7ffff -lime_bed, #a0ff23 -strider_spawn_egg, #f7ffff -jack_o_lantern, #ffd94a -shulker_spawn_egg, #f7ffff -brain_coral_block, #ff82e3 -acacia_sign, #be6c3d -red_stained_glass_pane, #da4848 -mushroom_stem, #ffffff -mangrove_chest_boat, #8d4e30 -waxed_cut_copper, #ff9772 -mourner_pottery_sherd, #945143 -suspicious_sand, #ffffe3 -scute, #4bd361 -exposed_copper, #e6b293 -diorite_slab, #ffffff -experience_bottle, #c9e85e -lead, #bf723e -netherite_helmet, #484143 -pointed_dripstone, #c29b84 -white_concrete, #ffffff -iron_horse_armor, #8a8282 -slime_ball, #8ddd82 -beetroot, #c23d3c -yellow_banner, #e7b96f -netherite_block, #5e575a -grindstone, #c6c6c6 -leather_chestplate, #bfbfbf -acacia_planks, #f08047 -waxed_exposed_copper, #e6b293 -red_sandstone, #ff8d29 -oxidized_cut_copper_stairs, #70dab4 -tube_coral_block, #467cff -waxed_weathered_cut_copper_slab, #9bcf98 -white_shulker_box, #ffffff -chicken_spawn_egg, #f7ffff -lime_concrete_powder, #b2ff3a -lime_shulker_box, #8df520 -yellow_glazed_terracotta, #ffff7d -oak_wood, #9b7947 -axolotl_bucket, #e6bbde -infested_mossy_stone_bricks, #a4ac96 -granite_wall, #d49379 -iron_sword, #96948e -orange_bed, #ffa81b -infested_stone, #b2b2b2 -sand, #ffffe8 -piglin_banner_pattern, #fffff1 -purpur_slab, #f1b2f1 -birch_stairs, #fffaac -arrow, #afa48e -bell, #ffda5b -lilac, #dcb2d2 -dark_oak_fence_gate, #5e3d1c -trapped_chest, #e7b96f -nether_brick, #572c34 -brown_glazed_terracotta, #aa9779 -iron_door, #ffffff -gilded_blackstone, #4e3c36 -large_amethyst_bud, #e6b4ff -raw_iron_block, #edc098 -bowl, #64440c -jungle_pressure_plate, #e4a472 -stripped_oak_log, #fccd7a -tripwire_hook, #cabea8 -white_wool, #ffffff -frog_spawn_egg, #f7ffff -dead_bush, #986f39 -diamond_axe, #448965 -warped_hanging_sign, #41918d -spyglass, #cd9e5f -red_shulker_box, #c82c2a -rabbit_spawn_egg, #f7ffff -dark_prismarine_stairs, #48826b -mossy_cobblestone, #9da886 -gray_carpet, #586165 -blue_glazed_terracotta, #435bc6 -budding_amethyst, #bc89ff -purple_banner, #e7b96f -jungle_button, #e4a472 -golden_chestplate, #fff150 -basalt, #68666e -lime_candle, #97fb2a -crimson_fence_gate, #904464 -bubble_coral_fan, #e42de3 -golden_leggings, #e8c53c -recovery_compass, #a1b9bb -smooth_sandstone_stairs, #fffff2 -acacia_log, #93897a -warped_fence, #3d948d -crimson_roots, #b40b3a -raw_copper, #c38962 -coal, #322f33 -bamboo_raft, #c8b457 -cobblestone_wall, #b5b5b5 -cobbled_deepslate_stairs, #6e6e72 -lime_banner, #e7b96f -green_stained_glass_pane, #91b548 -ward_armor_trim_smithing_template, #5c7c82 -explorer_pottery_sherd, #935143 -redstone_ore, #c89b9b -purple_glazed_terracotta, #9b43d9 -acacia_trapdoor, #de7c48 -bamboo_trapdoor, #ffff79 -polished_andesite_stairs, #bcbfbe -cartography_table, #5f3d1c -waxed_weathered_cut_copper, #9bcf98 -stone_brick_slab, #aeacae -phantom_membrane, #f2deda -bubble_coral_block, #eb25e7 -filled_map, #fffff2 -carrot, #aba11b -purpur_pillar, #f4b8f4 -wooden_pickaxe, #684d1c -stripped_jungle_log, #f4bc78 -eye_armor_trim_smithing_template, #ffffca -cyan_stained_glass, #6cb5da -mangrove_button, #a74d44 -smithing_table, #503436 -dark_oak_door, #644120 -cherry_fence, #fffef5 -pufferfish, #ffd472 -parrot_spawn_egg, #f7ffff -crimson_planks, #904464 -brain_coral_fan, #ff78da -amethyst_shard, #d2a0ff -drowned_spawn_egg, #f7ffff -paper, #ffffff -mud_brick_slab, #c39370 -allay_spawn_egg, #f7ffff -endermite_spawn_egg, #f7ffff -mangrove_sign, #8d433a -chainmail_leggings, #939393 -birch_sign, #e3cf91 -dark_oak_sign, #735029 -sandstone_slab, #ffffdd -birch_wood, #ffffff -birch_pressure_plate, #fffaac -coal_ore, #969696 -light_gray_carpet, #cacabf -ghast_spawn_egg, #f7ffff -green_shulker_box, #708e2c -dark_oak_slab, #5e3d1c -blue_ice, #a5eeff -cherry_leaves, #fff5ff -comparator, #aa7564 -prismarine_bricks, #8df4e1 -deepslate_gold_ore, #a4916f -elder_guardian_spawn_egg, #f7ffff -melon, #a2d02a -red_mushroom_block, #ff4140 -polar_bear_spawn_egg, #f7ffff -pumpkin_seeds, #ffffd0 -white_dye, #dad9f8 -mossy_stone_brick_stairs, #a4ac96 -purple_dye, #be5cfb -lingering_potion, #e8e8e8 -sniffer_egg, #6e645f -black_carpet, #1c1e23 -stray_spawn_egg, #f7ffff -writable_book, #aa8478 -sculk_vein, #a4350 -pillager_spawn_egg, #f7ffff -petrified_oak_slab, #e7b96f -creeper_head, #735847 -andesite_stairs, #c2c2c2 -baked_potato, #fab840 -glow_berries, #e3a73c -lime_dye, #83de20 -stripped_birch_wood, #fffba8 -podzol, #ae7c51 -soul_campfire, #87bca1 -mojang_banner_pattern, #fffff1 -andesite_slab, #c2c2c2 -light_gray_concrete, #b2b2a4 -pink_glazed_terracotta, #ffdcff -pumpkin, #ffa222 -dark_prismarine, #48826b -magenta_glazed_terracotta, #ff8eff -redstone_lamp, #874d2a -mangrove_boat, #8c3e33 -blackstone_stairs, #3c3239 -blue_orchid, #43e7f0 -iron_pickaxe, #847961 -music_disc_mellohi, #5b4e61 -dead_horn_coral_fan, #ffffff -warped_fungus_on_a_stick, #737354 -tadpole_bucket, #a0aaa5 -leather, #ca5e36 -music_disc_far, #506148 -pink_concrete_powder, #ffdaff -brown_concrete, #89542c -golden_sword, #d6b550 -dispenser, #aeacac -tadpole_spawn_egg, #f7ffff -light_gray_banner, #e7b96f -raw_iron, #dcbea0 -archer_pottery_sherd, #975444 -bamboo, #ffffff -infested_deepslate, #727275 -waxed_oxidized_cut_copper, #70dab4 -purple_stained_glass_pane, #b55afe -azalea_leaves, #80a23e -oak_hanging_sign, #c6a165 -stone_shovel, #7f725a -spruce_stairs, #a27844 -ghast_tear, #b4dddd -lime_carpet, #a0ff23 -snort_pottery_sherd, #935243 -shaper_armor_trim_smithing_template, #79665a -skull_pottery_sherd, #965244 -sandstone_stairs, #ffffdd -polished_granite_stairs, #dc977f -infested_cracked_stone_bricks, #a8a7a8 -deepslate_emerald_ore, #6f947c -blue_bed, #4b51e0 -birch_fence_gate, #fffaac -raw_gold, #ffe344 -pearlescent_froglight, #ffffff -bow, #725e37 -glass_bottle, #d4e7ff -brown_stained_glass_pane, #916c48 -flowering_azalea_leaves, #8d9e55 -jungle_boat, #9d6e4b -brown_mushroom_block, #d49e73 -cobbled_deepslate, #6e6e72 -cherry_slab, #fffef5 -red_nether_bricks, #620a0c -piglin_brute_spawn_egg, #f7ffff -lime_stained_glass, #b5ff23 -netherite_hoe, #5b4348 -mangrove_stairs, #a74d44 -birch_slab, #fffaac -light_blue_banner, #e7b96f -green_dye, #587f1c -cactus, #7db940 -bedrock, #797979 -donkey_spawn_egg, #f7ffff -blue_banner, #e7b96f -furnace, #828282 -ender_pearl, #1c7d6e -light_blue_candle, #3ac9ff -deepslate_diamond_ore, #769797 -diamond, #78ffff -powered_rail, #c39b69 -miner_pottery_sherd, #9b5747 -stone, #b2b2b2 -spruce_trapdoor, #937043 -light_blue_carpet, #52faff -sculk, #112a33 -ravager_spawn_egg, #f7ffff -poppy, #a2642d -pink_concrete, #ff90ca -chest, #e7b96f -blue_candle, #5273e8 -acacia_leaves, #d4d3d3 -iron_chestplate, #bfbfbf -egg, #f2e0aa -tube_coral, #4376ff -structure_block, #7d6980 -snow_golem_spawn_egg, #f7ffff -small_dripleaf, #86aa40 -red_sandstone_slab, #ff8d29 -mushroom_stew, #976836 -granite_stairs, #d49379 -mud, #555155 -jungle_log, #795f23 -smooth_basalt, #66666f -suspicious_stew, #967943 -weathered_cut_copper_stairs, #9bcf98 -waxed_exposed_cut_copper_slab, #dcac90 -oak_fence_gate, #e7b96f -deepslate_lapis_ore, #7080a4 -spruce_log, #523416 -chiseled_sandstone, #ffffdd -tube_coral_fan, #4782ff -bricks, #d68a76 -cyan_wool, #1ec3cf -llama_spawn_egg, #f7ffff -spectral_arrow, #ffcf47 -smooth_sandstone, #fffff2 -copper_ingot, #ff8358 -chainmail_helmet, #828282 -shield, #5e3d1c -chorus_flower, #d7abd7 -chiseled_polished_blackstone, #4b4450 -iron_leggings, #969696 -bamboo_stairs, #fff772 -yellow_terracotta, #ffbe32 -diamond_shovel, #4a9069 -warden_spawn_egg, #f7ffff -cherry_fence_gate, #fffef5 -purpur_block, #f1b2f1 -rabbit_stew, #b46e2c -sniffer_spawn_egg, #f7ffff -dark_oak_leaves, #d6d6d6 -cherry_trapdoor, #fffef5 -rooted_dirt, #cd936c -pink_banner, #e7b96f -melon_slice, #dd8040 -brown_stained_glass, #916c48 -dark_oak_wood, #554125 -red_concrete, #ca2d2d -spawner, #334158 -smooth_red_sandstone_stairs, #ff8a2c -andesite, #c2c2c2 -iron_boots, #909090 -string, #ccdcdd -arms_up_pottery_sherd, #975446 -lime_concrete, #86f022 -light_gray_stained_glass, #dadada -pink_bed, #ffc9f5 -composter, #a0642c -cyan_glazed_terracotta, #4aa8b2 -dead_bubble_coral_fan, #ffffff -polished_blackstone_brick_stairs, #443c46 -green_concrete_powder, #8aaa3e -warped_trapdoor, #43aa9e -gray_banner, #e7b96f -honey_block, #ffff4a -dead_tube_coral_block, #b9afaa -painting, #d0bb9d -red_candle, #e33a36 -yellow_bed, #ffff37 -deepslate_brick_wall, #646465 -large_fern, #b2b2b2 -oak_pressure_plate, #e7b96f -dead_fire_coral, #c2b6b1 -carrot_on_a_stick, #87693a -honeycomb, #ffda32 -wooden_sword, #644a1c -turtle_helmet, #349e47 -polished_blackstone_brick_slab, #443c46 -cobbled_deepslate_slab, #6e6e72 -cut_sandstone, #ffffe3 -grass, #cfcfcf -light_gray_shulker_box, #b1b1a4 -warped_stairs, #3d948d -cracked_nether_bricks, #391c20 -gray_terracotta, #513c32 -light_gray_bed, #cacabf -glow_item_frame, #f8c579 -bamboo_slab, #fff772 -spruce_slab, #a27844 -purple_wool, #ac3cf5 -diamond_hoe, #50724a -magenta_wool, #ff61ff -green_carpet, #789b26 -cobbled_deepslate_wall, #6e6e72 -prismarine_brick_slab, #8df4e1 -chiseled_nether_bricks, #432028 -netherite_chestplate, #51484b -glow_ink_sac, #3d9d96 -clay, #e4edff -red_carpet, #e43730 -daylight_detector, #b9a586 -fire_coral, #ed3441 -axolotl_spawn_egg, #f7ffff -light_blue_dye, #80bcff -dark_oak_boat, #613d1e -raiser_armor_trim_smithing_template, #796b5e -fire_coral_fan, #e13040 -red_dye, #f24d5a -beehive, #e0b46b -mooshroom_spawn_egg, #f7ffff -cut_copper_slab, #ff9772 -lime_stained_glass_pane, #b5ff23 -magenta_bed, #ff61ff -dark_oak_log, #554125 -shears, #c9a097 -charcoal, #373226 -deepslate, #727275 -nether_brick_slab, #3e1e25 -smooth_quartz_slab, #ffffff -blue_dye, #3d75ea -chiseled_bookshelf, #fecd7d -mossy_cobblestone_stairs, #9da886 -spruce_fence_gate, #a27844 -warped_roots, #1cc5b1 -diamond_pickaxe, #437654 -stick, #6c5a37 -waxed_weathered_copper, #9ada9d -glass, #c8d4d7 -zombie_horse_spawn_egg, #f7ffff -witch_spawn_egg, #f7ffff -silence_armor_trim_smithing_template, #47666c -flint, #474646 -gray_candle, #768a90 -totem_of_undying, #ffc86c -red_sandstone_stairs, #ff8d29 -mycelium, #a17c65 -deepslate_tile_wall, #4d4d4e -acacia_slab, #f08047 -bamboo_mosaic_slab, #fff26f -dead_bubble_coral_block, #bbafaa -echo_shard, #c4a57 -tuff, #9a9b91 -cyan_carpet, #1ec3cf -acacia_pressure_plate, #f08047 -pink_shulker_box, #fface0 -iron_hoe, #80725a -magenta_banner, #e7b96f -brown_shulker_box, #975e32 -cyan_banner, #e7b96f -oxidized_copper, #75e7bc -pink_carpet, #ffc9f5 -purple_stained_glass, #b55afe -iron_block, #ffffff -birch_chest_boat, #b89d62 -mangrove_propagule, #89fa76 -dead_horn_coral_block, #beb4ae -piglin_spawn_egg, #f7ffff -orange_candle, #ff9a1b -light_blue_shulker_box, #46e8ff -golden_apple, #ffc839 -peony, #b8b4c6 -pink_dye, #ffb5f1 -written_book, #874e3a -golden_helmet, #d4b134 -dead_brain_coral_fan, #fffcf8 -turtle_spawn_egg, #f7ffff -light_gray_wool, #cacabf -shulker_box, #c689c6 -rotten_flesh, #af5529 -medium_amethyst_bud, #e1abff -chainmail_boots, #8a8a8a -orange_carpet, #ffa81b -crimson_sign, #943e5e -brown_candle, #ab6c40 -dead_tube_coral, #a89e98 -hopper, #5f615f -gray_shulker_box, #4e5258 -skeleton_skull, #735847 -tide_armor_trim_smithing_template, #7feede -damaged_anvil, #616161 -dark_oak_stairs, #5e3d1c -sculk_shrieker, #12262f -prismarine_slab, #91dcd9 -polished_deepslate, #666668 -pig_spawn_egg, #f7ffff -cut_red_sandstone, #ff902c -coarse_dirt, #aa7954 -jungle_door, #dea170 -gravel, #bbb5b4 -brick_slab, #d68a76 -black_wool, #1c1e23 -cracked_deepslate_bricks, #5b5b5c -stone_axe, #7a6f58 -jungle_fence, #e4a472 -white_stained_glass, #ffffff -purple_shulker_box, #932dde -dolphin_spawn_egg, #f7ffff -oak_door, #caa764 -cut_red_sandstone_slab, #ff902c -smoker, #7c6b51 -cherry_boat, #ffd4cf -calibrated_sculk_sensor, #12262f -lapis_ore, #98a7c9 -quartz_block, #ffffff -blast_furnace, #989898 -spruce_boat, #7c5b36 -redstone, #980700 -brain_coral, #ff78d9 -dandelion, #d2f53d -grass_block, #bf895f -beetroot_soup, #7c3912 -blue_shulker_box, #3d40c8 -red_sandstone_wall, #ff8d29 -magenta_carpet, #ff61ff -zombified_piglin_spawn_egg, #f7ffff -horse_spawn_egg, #f7ffff -purple_concrete_powder, #bb4efc -light, #ffff2a -white_candle, #ffffff -torchflower_seeds, #79a762 -dune_armor_trim_smithing_template, #feffc5 -crimson_hyphae, #832329 -iron_shovel, #a2967f -waxed_exposed_cut_copper_stairs, #dcac90 -acacia_sapling, #a8a720 -crimson_hanging_sign, #904a66 -bee_spawn_egg, #f7ffff -trader_llama_spawn_egg, #f7ffff -knowledge_book, #6baa68 -pitcher_plant, #aecdff -deepslate_tile_stairs, #4d4d4e -map, #fffff2 -tnt_minecart, #9a6e62 -prismarine, #91dcd9 -respawn_anchor, #372058 -diamond_horse_armor, #86ffda -magenta_stained_glass, #fe6cff -stone_brick_wall, #aeacae -big_dripleaf, #9ec948 -barrier, #ff0000 -cave_spider_spawn_egg, #f7ffff -sheaf_pottery_sherd, #945243 -campfire, #d39647 -yellow_concrete_powder, #ffff4d -nautilus_shell, #e8bea0 -cookie, #ffa050 -gray_concrete, #4d5157 -ochre_froglight, #ffffff -oak_chest_boat, #9b7944 -sentry_armor_trim_smithing_template, #708080 -weathered_copper, #9ada9d -porkchop, #ffa1a1 -compass, #786f6f -flint_and_steel, #5b5b5b -lime_wool, #a0ff23 -observer, #939393 -milk_bucket, #c6c9c9 -diorite_wall, #ffffff -kelp, #7ab637 -glistering_melon_slice, #ff984a -netherrack, #8a3636 -seagrass, #75bf4b -chiseled_stone_bricks, #aaa8aa -stripped_birch_log, #fffba8 -stone_slab, #b2b2b2 -music_disc_pigstep, #9d4d3a -blackstone_wall, #3c3239 -golden_boots, #e1bf3d -dragon_egg, #110c15 -fletching_table, #f7dd9e -blue_wool, #4b51e0 -music_disc_ward, #4a5447 -shroomlight, #ffd064 -squid_spawn_egg, #f7ffff -dried_kelp, #9d9891 -red_concrete_powder, #f04d47 -fox_spawn_egg, #f7ffff -end_stone_bricks, #ffffe7 -stonecutter, #a8a7a8 -salmon_bucket, #9d9eaa -orange_wool, #ffa81b -diamond_leggings, #3cbfaf -magenta_dye, #f579f2 -blackstone_slab, #3c3239 -warped_sign, #3c9190 -rose_bush, #bb5e34 -red_mushroom, #ff6b5f -music_disc_stal, #414141 -lantern, #d0a176 -howl_pottery_sherd, #9a5546 -pink_tulip, #9ae37c -jungle_wood, #795f23 -packed_ice, #c9ffff -cyan_stained_glass_pane, #6cb5da -stripped_warped_stem, #51d6d2 -orange_concrete, #ff8a00 -crimson_button, #904464 -black_dye, #262539 -soul_torch, #9ba47f -music_disc_blocks, #5c4b48 -prismarine_brick_stairs, #8df4e1 -cut_copper, #ff9772 -crimson_trapdoor, #934766 -diamond_block, #8cffff -mangrove_door, #9e4640 -polished_basalt, #7d7d82 -music_disc_13, #615e51 -light_blue_terracotta, #a19ac3 -crimson_door, #ab5175 -magma_block, #ca5a2c -purple_concrete, #8e2cde -raw_gold_block, #fff141 -conduit, #fffffa -diamond_boots, #3cb5a5 -polished_diorite_stairs, #ffffff -zombie_villager_spawn_egg, #f7ffff -firework_rocket, #e17573 -spider_spawn_egg, #f7ffff -silverfish_spawn_egg, #f7ffff -pitcher_pod, #945f48 -dark_prismarine_slab, #48826b -golden_axe, #b9942a -netherite_axe, #5f434a -leather_helmet, #919191 -dead_brain_coral, #beb2ab -camel_spawn_egg, #f7ffff -birch_sapling, #b5e470 -stripped_cherry_wood, #ffcfd3 -spruce_chest_boat, #825e30 -spruce_sapling, #3e5533 -jungle_stairs, #e4a472 -mud_brick_wall, #c39370 -candle, #ffffb9 -diamond_chestplate, #50edda -dripstone_block, #bf9883 -leather_horse_armor, #bfa591 -polished_blackstone_pressure_plate, #4b4450 -glow_lichen, #a0b9ac -light_blue_stained_glass, #91daff -dirt, #bf895f -host_armor_trim_smithing_template, #6f5e51 -yellow_dye, #ffe132 -quartz_bricks, #ffffff -crimson_stairs, #904464 -ender_eye, #66ab7d -birch_planks, #fffaac -brick, #be5c41 -pink_stained_glass_pane, #ffb5eb -deepslate_redstone_ore, #946869 -golden_carrot, #ca8e26 -stripped_warped_hyphae, #51d6d2 -chiseled_deepslate, #4d4d4d -coast_armor_trim_smithing_template, #86949d -firework_star, #798987 -soul_lantern, #73b5c8 -warped_fence_gate, #3d948d -bamboo_mosaic_stairs, #fff26f -spruce_hanging_sign, #866640 -end_stone_brick_slab, #ffffe7 -magenta_shulker_box, #f74de8 -music_disc_wait, #4e545b -item_frame, #d7a468 -yellow_shulker_box, #ffff29 -deepslate_iron_ore, #978d86 -white_banner, #e7b96f -dropper, #aeacac -granite_slab, #d49379 -gray_bed, #586165 -warped_fungus, #699b7c -husk_spawn_egg, #f7ffff -chain, #465068 -wandering_trader_spawn_egg, #f7ffff -dead_tube_coral_fan, #ffffff -lily_of_the_valley, #ffffff -sculk_sensor, #12262f -polished_andesite_slab, #bcbfbe -nether_bricks, #3e1e25 -green_glazed_terracotta, #a7ca5f -red_bed, #e43730 -nether_brick_fence, #3e1e25 -redstone_torch, #f4703e -crimson_stem, #832329 -cooked_beef, #894b34 -bamboo_block, #b5cd51 -stripped_spruce_wood, #a47f4a -netherite_pickaxe, #5c4048 -iron_trapdoor, #ffffff -blaze_rod, #ffbf25 -twisting_vines, #1cc0ae -stripped_mangrove_wood, #aa4d43 -panda_spawn_egg, #f7ffff -stone_bricks, #aeacae -smooth_stone_slab, #eeeeee -end_rod, #ffffff -obsidian, #150e22 -blue_stained_glass, #486cfe -birch_trapdoor, #ffffe0 -jungle_fence_gate, #e4a472 -stone_brick_stairs, #aeacae -spruce_wood, #523416 -orange_dye, #ffb433 -oak_planks, #e7b96f -hoglin_spawn_egg, #f7ffff -cooked_porkchop, #f7d690 -light_blue_wool, #52faff -blue_stained_glass_pane, #486cfe -barrel, #987347 -moss_block, #7f9b40 -light_blue_bed, #52faff -red_glazed_terracotta, #ff544b -acacia_wood, #93897a -rabbit, #ffe6cd -sea_lantern, #f5ffff -light_gray_candle, #b4b4aa -warped_pressure_plate, #3d948d -rabbit_hide, #cf9e68 -polished_diorite_slab, #ffffff -oak_leaves, #cdcdcd -andesite_wall, #c2c2c2 -black_concrete_powder, #23252c -music_disc_11, #444444 -golden_horse_armor, #feb634 -gray_glazed_terracotta, #768084 -waxed_exposed_cut_copper, #dcac90 -activator_rail, #a47c69 -spruce_door, #91724b -azure_bluet, #e1ffdd -granite, #d49379 -jungle_leaves, #dedccc -polished_blackstone_stairs, #4b4450 -cobblestone_stairs, #b5b5b5 +emerald_block, #d635a9 +light_gray_glazed_terracotta, #705a59 +honeycomb, #1767dd +exposed_cut_copper_stairs, #66879b +diorite_stairs, #444444 +dark_prismarine, #cda5b5 +zoglin_spawn_egg, #ce10c3 +twisting_vines, #ec7986 +white_concrete_powder, #1f1d1d +mushroom_stew, #96b7da +magenta_banner, #5e7eb2 +light_blue_stained_glass_pane, #9a6728 +blue_terracotta, #b6c5a5 +cherry_leaves, #1b543e +mangrove_pressure_plate, #8bcad0 +activator_rail, #8da9b6 +mooshroom_spawn_egg, #20c870 +sugar_cane, #ab6fdd +snow_block, #70202 +golden_chestplate, #4257c8 +stripped_acacia_wood, #52a4c5 +purple_stained_glass, #81c14e +wither_rose, #d8ceea +witch_spawn_egg, #240000 +red_terracotta, #71c3d2 +brown_terracotta, #b3cddd +chicken, #336375 +birch_sapling, #8160b1 +saddle, #71bce0 +flint, #cecfcf +fire_coral_block, #5dddd2 +bone_meal, #62624d +mossy_cobblestone, #928aa2 +white_dye, #676852 +fletching_table, #536591 +polished_blackstone, #cbd0c8 +axolotl_spawn_egg, #9fb845 +furnace, #a5a5a5 +dolphin_spawn_egg, #fa680b +gray_stained_glass_pane, #b4b4b4 +waxed_oxidized_cut_copper_stairs, #b16782 +crimson_trapdoor, #99ceb8 +peony, #7f8275 +sponge, #3d40b6 +mud, #c4c7c4 +horse_spawn_egg, #c0905b +infested_deepslate, #b0b0ae +music_disc_far, #c8bccd +weathered_cut_copper, #936f95 +polished_blackstone_brick_stairs, #d0d6cf +red_sandstone_wall, #469de3 +gold_block, #a30c3 +fishing_rod, #a8b1c3 +stonecutter, #8a8b8a +red_stained_glass, #67cdcd +orange_shulker_box, #1696f8 +heartbreak_pottery_sherd, #97c6d0 +detector_rail, #8598a6 +ghast_spawn_egg, #45f8ff +stone_pressure_plate, #838383 +nether_brick_slab, #d4ebe6 +cyan_stained_glass, #b48167 +cracked_stone_bricks, #8a8b8a +snowball, #3a2222 +sculk_vein, #f9d1c8 +friend_pottery_sherd, #97c5d0 +potato, #4e80cd +polished_blackstone_wall, #cbd0c8 +chicken_spawn_egg, #cdb817 +diamond_sword, #d995a4 +red_glazed_terracotta, #4bc5cb +ice, #6f4903 +sniffer_egg, #b3babd +crimson_fence_gate, #9bd0ba +bamboo_button, #3f53b0 +weathered_copper, #946792 +shaper_armor_trim_smithing_template, #abb8c1 +black_stained_glass, #e7e7e7 +netherite_axe, #bdd1cc +nether_wart, #8de5de +polished_diorite, #403f3e +daylight_detector, #7e8ca2 +stripped_mangrove_log, #89cad1 +deepslate_brick_slab, #babab9 +stone_brick_stairs, #868786 +hanging_roots, #5f8da5 +rail, #8391a8 +green_dye, #c2a7ec +campfire, #6c97ce +purple_bed, #87d654 +dragon_breath, #476043 +bamboo_hanging_sign, #5f6fb5 +bamboo_raft, #7482c3 +blue_dye, #d5ae5c +music_disc_pigstep, #92cad7 +stone_sword, #a9abaf +acacia_trapdoor, #64a9cd +cherry_stairs, #1e4e54 +waxed_oxidized_cut_copper_slab, #b16782 +stripped_oak_wood, #4f70aa +bee_spawn_egg, #2928e5 +light_blue_concrete, #dd773a +waxed_cut_copper_stairs, #4196b0 +warped_fungus_on_a_stick, #afafc5 +salmon_spawn_egg, #20c870 +mud_brick_wall, #7799b1 +green_concrete, #b7a5dc +light_gray_stained_glass_pane, #676767 +quartz_stairs, #151b22 +pink_petals, #1c5045 +dark_oak_hanging_sign, #b1c6dd +green_glazed_terracotta, #8b72bd +tadpole_spawn_egg, #a9a89b +blue_bed, #cbc763 +spruce_trapdoor, #99b1d1 +lingering_potion, #e800e8 +blackstone_stairs, #d6ddd8 +calcite, #212024 +beef, #49c5cd +slime_spawn_egg, #bd0052 +purple_shulker_box, #99e064 +nether_gold_ore, #8dcad6 +melon_slice, #65a6d3 +lever, #91a3bd +fermented_spider_eye, #99f0d9 +host_armor_trim_smithing_template, #b2bec7 +copper_ingot, #4aa4c2 +bedrock, #ababab +birch_chest_boat, #7f92bb +composter, #90bae1 +sheaf_pottery_sherd, #98c6d1 +miner_pottery_sherd, #93c3ce +deepslate_brick_wall, #babab9 +cooked_rabbit, #568db0 +gray_glazed_terracotta, #ada6a3 +dark_prismarine_slab, #cda5b5 +granite, #6b99ab +stripped_crimson_stem, #77c7a6 +pink_carpet, #137354 +birch_planks, #405187 +written_book, #a1c9d7 +white_carpet, #171414 +tipped_arrow, #a800a8 +diamond, #ac434c +spruce_leaves, #be4ebe +polished_deepslate_wall, #b8b8b7 +brown_glazed_terracotta, #8996ab +parrot_spawn_egg, #c908dd +magenta_dye, #54ab56 +leather, #72beda +debug_stick, #b4c1d9 +iron_chestplate, #7a7a7a +bamboo, #2a2137 +sea_pickle, #1c1a24 +golden_helmet, #6b84db +azalea_leaves, #a68ed4 +chest_minecart, #9ca7bc +purple_dye, #7bbf50 +jungle_hanging_sign, #82a3be +blue_orchid, #d15e58 +gray_wool, #c2bcb9 +white_tulip, #9a5cb0 +soul_lantern, #af8174 +brown_carpet, #8eb9d8 +verdant_froglight, #2d1630 +prismarine_brick_slab, #9d5562 +netherite_shovel, #baccc6 +cherry_door, #23595f +raw_copper_block, #6697b1 +stripped_crimson_hyphae, #77c7a6 +seagrass, #ae7acb +soul_soil, #b5c7d2 +moss_block, #a793d3 +firework_star, #aba0a1 +jungle_sapling, #d1aff0 +acacia_sign, #7bb4d5 +warped_slab, #d5989d +leather_chestplate, #c0de80 +stone_shovel, #a7b0c1 +iron_ore, #787f86 +feather, #313131 +bowl, #bad0f7 +dried_kelp, #92959a +red_dye, #56cac1 +heavy_weighted_pressure_plate, #242424 +mud_brick_stairs, #7799b1 +vindicator_spawn_egg, #b168cd +oxidized_cut_copper_slab, #b16782 +golden_horse_armor, #4e80db +mutton, #4bc1c8 +light_blue_bed, #c65127 +quartz_slab, #151b22 +zombie_villager_spawn_egg, #1e2075 +yellow_concrete_powder, #1839ca +structure_block, #a8b6a6 +cut_red_sandstone, #439be1 +bone_block, #1b1f31 +cracked_deepslate_tiles, #cccccc +spruce_sapling, #d4c4dc +brown_banner, #5e7eb2 +smooth_sandstone_stairs, #212a56 +gray_banner, #5e7eb2 +blue_concrete, #d4d271 +allay_spawn_egg, #b049 +purple_candle, #91dd5d +cut_copper_slab, #4196b0 +budding_amethyst, #7ca046 +yellow_stained_glass_pane, #1b1bcd +cod, #5c81a4 +armor_stand, #8fa3c3 +spruce_sign, #a4bedc +bamboo_slab, #3f53b0 +shulker_spawn_egg, #408cc +smooth_basalt, #b8b8b2 +pink_terracotta, #5fb2b2 +mangrove_sign, #9dd1d7 +dirt, #7aa0bd +cartography_table, #bdd5ec +music_disc_strad, #bcbcbc +map, #2b2b56 +dark_oak_trapdoor, #b5cfe9 +glow_item_frame, #5276ab +smooth_sandstone, #212a56 +polished_granite_stairs, #6696a7 +polished_diorite_slab, #403f3e +tropical_fish_bucket, #768b8d +snout_armor_trim_smithing_template, #c8c3bb +wheat, #7486bd +mangrove_roots, #b5c5da +cut_copper_stairs, #4196b0 +music_disc_cat, #ccbfd2 +gray_dye, #919191 +white_candle, #2f2726 +barrel, #95afce +lime_carpet, #9047e7 +spectral_arrow, #486fce +music_disc_relic, #95b6bd +zombie_spawn_egg, #c819 +wild_armor_trim_smithing_template, #9e8a97 +green_banner, #5e7eb2 +white_glazed_terracotta, #442c36 +cave_spider_spawn_egg, #1c70c2 +lime_terracotta, #998bcc +spruce_hanging_sign, #a2b8d3 +jukebox, #a8c6d8 +dead_fire_coral_block, #7d8589 +oak_fence_gate, #5e7eb2 +pink_shulker_box, #1a8763 +stripped_jungle_wood, #557cac +emerald_ore, #94788d +purple_concrete, #9ce164 +stone_pickaxe, #b2bbcb +magenta_glazed_terracotta, #309c41 +glow_squid_spawn_egg, #15d07a +lime_stained_glass_pane, #8134e7 +music_disc_ward, #ccc5ce +prismarine_crystals, #73525e +cherry_boat, #2f6b6f +oak_chest_boat, #93abd0 +oak_sapling, #b396d8 +gray_carpet, #c2bcb9 +fire_coral_fan, #62ded3 +endermite_spawn_egg, #ded0ba +chiseled_polished_blackstone, #cbd0c8 +terracotta, #68a2bd +mangrove_button, #8bcad0 +cobbled_deepslate_slab, #b3b3b0 +andesite_stairs, #787878 +acacia_planks, #58a6ce +purpur_pillar, #557f55 +polished_blackstone_brick_wall, #d0d6cf +guardian_spawn_egg, #d2707e +packed_mud, #7296b1 +green_bed, #ac93e5 +deepslate_emerald_ore, #b298a9 +dead_bubble_coral_block, #7d8589 +cyan_candle, #ef7e7d +dark_oak_stairs, #bed5ec +porkchop, #2f8f8f +pumpkin_seeds, #37396e +stripped_jungle_log, #557cac +smooth_quartz_stairs, #141a21 +ladder, #84a0ca +polished_andesite, #7c7a7b +music_disc_11, #d0d0d0 +diamond_block, #9e131c +amethyst_shard, #6d9040 +azalea, #a593d6 +stone, #838383 +creeper_spawn_egg, #c908dd +tube_coral_block, #cfa932 +enchanting_table, #f1f6e8 +small_amethyst_bud, #7d9d40 +gray_concrete_powder, #b4afac +gravel, #7d8182 +enchanted_book, #9bbed7 +acacia_wood, #99a0aa +wheat_seeds, #c37ae5 +echo_shard, #f7ccc3 +pink_bed, #137354 +grass, #3c0d9b +yellow_dye, #4962dd +pink_dye, #378157 +golden_axe, #7e98e2 +wooden_pickaxe, #b7caec +warped_stairs, #d5989d +trader_llama_spawn_egg, #22e050 +spider_eye, #9fefd8 +pink_stained_glass, #e815b +crimson_hyphae, #a3e7e2 +polished_blackstone_bricks, #d0d6cf +redstone, #95fb00 +polished_deepslate, #b8b8b7 +fern, #54dfd9 +lime_bed, #9047e7 +soul_campfire, #a17c8f +filled_map, #2b2b56 +honey_block, #547cc +red_candle, #61d7da +green_shulker_box, #b19ce1 +cake, #315971 +polished_blackstone_slab, #cbd0c8 +sugar, #3b3b32 +blaze_spawn_egg, #3ef0b7 +stone_button, #838383 +smooth_stone, #626262 +netherite_helmet, #cdd2d1 +ochre_froglight, #b174b +infested_stone_bricks, #868786 +gray_shulker_box, #c9c6c2 +dripstone_block, #7a95a4 +big_dripleaf, #9173cd +white_terracotta, #2f4e5f +purple_terracotta, #8abaaa +waxed_exposed_cut_copper_slab, #66879b +orange_dye, #3482dc +prismarine_stairs, #9e5f6b +jungle_stairs, #608db0 +orange_wool, #108aed +chorus_fruit, #82a383 +cracked_deepslate_bricks, #c0c0bf +squid_spawn_egg, #fa680b +nether_brick_fence, #d4ebe6 +tadpole_bucket, #90898c +bamboo_chest_raft, #90a3d6 +nether_wart_block, #8efefe +beetroot, #78d5d6 +chain, #cfc8b7 +deepslate_gold_ore, #8d9ab2 +carved_pumpkin, #6aacef +panda_spawn_egg, #1b0821 +ender_dragon_spawn_egg, #ec2004 +bamboo_trapdoor, #3a4dab +kelp, #aa80d9 +golden_pickaxe, #8da4e5 +danger_pottery_sherd, #94c4cf +suspicious_sand, #273461 +blast_furnace, #959595 +cut_copper, #4196b0 +writable_book, #89a3ac +spider_spawn_egg, #2458e1 +skull_pottery_sherd, #97c6d0 +fox_spawn_egg, #f1d0a9 +elder_guardian_spawn_egg, #36a0f6 +spore_blossom, #32a062 +globe_banner_pattern, #3d4457 +light_blue_concrete_powder, #b64c2b +gray_concrete, #cac7c3 +warped_hyphae, #c7c5b3 +horn_coral_fan, #3349c3 +cyan_dye, #dd9678 +cherry_fence, #1e4e54 +deepslate_coal_ore, #b6b6b4 +white_wool, #171414 +turtle_helmet, #db91ce +silence_armor_trim_smithing_template, #ceb8b4 +netherite_pickaxe, #bfd3cd +tinted_glass, #d5dad3 +large_amethyst_bud, #5f8236 +infested_stone, #838383 +dark_prismarine_stairs, #cda5b5 +crimson_sign, #98d4be +chest, #5e7eb2 +chainmail_leggings, #999999 +light_gray_banner, #5e7eb2 +pearlescent_froglight, #15201c +dark_oak_sapling, #c3a6e2 +melon_seeds, #c7d0e9 +lime_wool, #9047e7 +iron_ingot, #646464 +dark_oak_leaves, #300e10 +crimson_stairs, #9bd0ba +villager_spawn_egg, #1e2075 +stripped_oak_log, #4f70aa +strider_spawn_egg, #6c609a +snow, #70202 +magenta_stained_glass, #4eb428 +creeper_banner_pattern, #3d4457 +jungle_log, #abbde7 +infested_chiseled_stone_bricks, #898a89 +gold_nugget, #4668c0 +fire_charge, #a4bed7 +crimson_planks, #9bd0ba +cherry_sapling, #5c8b71 +explorer_pottery_sherd, #99c7d1 +pumpkin_pie, #3874b3 +mangrove_door, #91cfd3 +mangrove_wood, #adbed7 +dark_oak_fence, #bed5ec +chiseled_nether_bricks, #d1e9e4 +crafting_table, #7f97ba +mangrove_propagule, #a051ad +birch_slab, #405187 +bell, #3f67c0 +mangrove_fence_gate, #8bcad0 +warped_stem, #c7c5b3 +mushroom_stem, #353c47 +netherite_boots, #cfd5d3 +spruce_boat, #a9c0da +light_gray_shulker_box, #84848d +leather_horse_armor, #c0c480 +crying_obsidian, #e0f6c4 +end_stone_brick_slab, #26205e +polished_granite_slab, #6696a7 +light_gray_concrete_powder, #66666c +nether_quartz_ore, #8bbfc2 +magenta_concrete, #57d061 +dead_brain_coral, #7b8388 +diorite, #444444 +netherite_leggings, #ccd2d1 +music_disc_mellohi, #c0c9bc +waxed_weathered_cut_copper_stairs, #936f95 +birch_button, #405187 +red_bed, #60d9de +brown_mushroom_block, #6b91af +cooked_beef, #a0cbdb +waxed_exposed_copper, #5f8399 +dune_armor_trim_smithing_template, #4e4c76 +blackstone, #d6ddd8 +donkey_spawn_egg, #1798bf +oak_door, #728bba +crossbow, #acbcc7 +camel_spawn_egg, #4c280f +eye_armor_trim_smithing_template, #484172 +waxed_exposed_cut_copper, #66879b +iron_sword, #97989c +quartz_block, #151b22 +pink_concrete_powder, #1c674b +spruce_door, #9ab0cb +sheep_spawn_egg, #1b0821 +flower_banner_pattern, #3d4457 +bucket, #898989 +crimson_pressure_plate, #9bd0ba +purpur_block, #578357 +jungle_trapdoor, #6892b3 +deepslate_tile_wall, #cacac9 +acacia_leaves, #e8a4e0 +magenta_shulker_box, #53ca5d +bamboo_mosaic, #4256b2 +cherry_log, #cadfd4 +stray_spawn_egg, #8dd011 +iron_shovel, #8e97a7 +target, #1b5058 +deepslate_lapis_ore, #b1a68d +raw_gold, #2f61d0 +mossy_stone_brick_stairs, #8d8797 +brown_shulker_box, #96bedd +salmon, #9fbbc2 +rooted_dirt, #7099b4 +respawn_anchor, #d9e9c2 +light_gray_candle, #828289 +dried_kelp_block, #dad0e3 +chiseled_red_sandstone, #49a0e5 +smooth_quartz_slab, #141a21 +crimson_nylium, #95e6e6 +cherry_planks, #1e4e54 +recovery_compass, #8f7e7d +acacia_log, #99a0aa +polished_deepslate_stairs, #b8b8b7 +yellow_concrete, #1051eb +trident, #866d74 +redstone_torch, #55b1d4 +chainmail_chestplate, #848484 +bamboo_planks, #3f53b0 +popped_chorus_fruit, #86af86 +granite_wall, #6b99ab +cut_sandstone, #273261 +enderman_spawn_egg, #ded0ba +raw_iron_block, #5a7995 +torchflower_seeds, #ab8bbb +shulker_shell, #90b58b +sculk, #f4e2dc +honey_bottle, #4b6784 +diamond_boots, #d6818c +archer_pottery_sherd, #96c5d0 +birch_pressure_plate, #405187 +dead_fire_coral_fan, #565a5c +music_disc_blocks, #bfcbcd +birch_trapdoor, #313e63 +phantom_membrane, #566467 +coast_armor_trim_smithing_template, #a29892 +deepslate_bricks, #babab9 +tripwire_hook, #727b8a +trapped_chest, #5e7eb2 +orange_concrete_powder, #1d7de1 +iron_nugget, #888079 +goat_spawn_egg, #8160a4 +bubble_coral_fan, #60e061 +iron_hoe, #a6b0c1 +sandstone_slab, #283565 +white_concrete, #312b2a +bricks, #6a9fad +warped_fungus, #b693a9 +nether_star, #675363 +wooden_shovel, #aec3e9 +stripped_dark_oak_wood, #b8c8dc +warped_fence, #d5989d +ocelot_spawn_egg, #83905b +iron_golem_spawn_egg, #ff58ae +cherry_hanging_sign, #498582 +prismarine_brick_stairs, #9d5562 +cobblestone_slab, #818181 +bamboo_stairs, #3f53b0 +flint_and_steel, #c0c0c0 +spruce_slab, #8eacd0 +turtle_egg, #5d5778 +mojang_banner_pattern, #3d4457 +end_stone_brick_wall, #26205e +blackstone_slab, #d6ddd8 +green_concrete_powder, #9f89d4 +bubble_coral, #5fe961 +warped_hanging_sign, #d29a9d +magenta_wool, #43bc4d +dark_oak_planks, #bed5ec +spruce_fence_gate, #8eacd0 +snow_golem_spawn_egg, #a5f0fe +repeater, #83a6b1 +potion, #e800e8 +knowledge_book, #b589b7 +iron_block, #242424 +husk_spawn_egg, #c58057 +golden_hoe, #92a8e4 +blaze_powder, #499cf1 +green_terracotta, #b4add6 +cooked_salmon, #95b3cb +pink_banner, #5e7eb2 +green_wool, #ac93e5 +horn_coral_block, #2839be +clay_ball, #8d8675 +light_gray_dye, #68685c +dead_bush, #95b2d8 +birch_sign, #616f9a +pufferfish, #496bb0 +magenta_stained_glass_pane, #4eb428 +cherry_trapdoor, #1e4e54 +chain_command_block, #7e636f +bamboo_mosaic_slab, #4256b2 +glass_bottle, #6b5e45 +amethyst_block, #7b9f41 +oak_sign, #708dbd +mud_bricks, #7799b1 +lime_stained_glass, #8134e7 +conduit, #374251 +gray_bed, #c2bcb9 +crimson_door, #88c7ae +rib_armor_trim_smithing_template, #d1d6ce +waxed_weathered_cut_copper_slab, #936f95 +suspicious_gravel, #7f8384 +jungle_wood, #abbde7 +brown_stained_glass, #9ab4cd +chainmail_boots, #9f9f9f +dark_oak_button, #bed5ec +diamond_shovel, #cc9bb6 +disc_fragment_5, #d5c5c2 +music_disc_5, #d0bfbb +wooden_hoe, #b6c9eb +white_stained_glass, #10101 +slime_block, #9140a5 +magma_cream, #5679c7 +nether_bricks, #d4ebe6 +granite_slab, #6b99ab +dark_oak_chest_boat, #b1cae8 +dead_horn_coral_block, #7b8286 +red_nether_brick_wall, #bbf9f7 +infested_cracked_stone_bricks, #8a8b8a +sand, #25315d +honeycomb_block, #1b6ce3 +light_blue_wool, #c65127 +infested_mossy_stone_bricks, #8d8797 +end_stone_bricks, #26205e +soul_torch, #938da7 +stripped_birch_log, #3c508a +repeating_command_block, #80935a +red_nether_brick_stairs, #bbf9f7 +nether_brick, #c3e1db +melon, #8e6ee2 +heart_pottery_sherd, #9ac7d2 +golden_carrot, #729ce5 +crimson_button, #9bd0ba +sandstone, #283565 +bone, #353649 +leather_boots, #c0b680 +orange_carpet, #108aed +quartz_pillar, #151a20 +gunpowder, #adadad +elytra, #a2a29a +flowering_azalea, #a593d6 +cut_red_sandstone_slab, #439be1 +wooden_sword, #baccec +cornflower, #191410 +oak_fence, #5e7eb2 +firework_rocket, #62aeaf +white_stained_glass_pane, #10101 +jungle_slab, #608db0 +sandstone_wall, #283565 +carrot, #888fed +cyan_concrete, #eb8978 +cyan_shulker_box, #ec8779 +brick_stairs, #6a9fad +azure_bluet, #623a65 +jungle_button, #608db0 +glowstone, #557dac +warped_nylium, #b8c3c5 +blue_wool, #cbc763 +birch_leaves, #272a +tube_coral_fan, #cea530 +end_stone, #252262 +angler_pottery_sherd, #92c3ce +weathered_cut_copper_slab, #936f95 +light_gray_stained_glass, #676767 +moss_carpet, #a793d3 +end_rod, #313a45 +pink_glazed_terracotta, #15664b +llama_spawn_egg, #c0905b +dead_horn_coral, #72797f +bamboo_fence, #840084 +crimson_stem, #a3e7e2 +sweet_berries, #aadde4 +birch_stairs, #405187 +red_mushroom, #28b5bd +cyan_stained_glass_pane, #b48167 +nautilus_shell, #5d7b90 +white_bed, #171414 +spire_armor_trim_smithing_template, #6e9061 +exposed_cut_copper_slab, #66879b +zombie_head, #afc2ce +nether_brick_stairs, #d4ebe6 +birch_fence, #405187 +chipped_anvil, #bcbcbc +warden_spawn_egg, #23502f +purple_stained_glass_pane, #81c14e +dead_tube_coral_fan, #36393a +pitcher_plant, #867043 +lime_shulker_box, #9d54e9 +crimson_roots, #82f8d7 +black_wool, #ecebe7 +red_nether_bricks, #bbf9f7 +mourner_pottery_sherd, #98c7d1 +acacia_sapling, #8a8be9 +scute, #cb6cbc +golden_shovel, #7e91d8 +cookie, #4b90c8 +item_frame, #698db7 +purpur_slab, #578357 +dragon_egg, #f4f7f1 +blade_pottery_sherd, #92c3ce +stripped_spruce_log, #8da7cc +shelter_pottery_sherd, #95c5cf +pink_stained_glass_pane, #e815b +dead_horn_coral_fan, #424749 +sniffer_spawn_egg, #3b906f +lapis_block, #e2bd74 +prize_pottery_sherd, #96c5d0 +spawner, #dcd2c2 +frog_spawn_egg, #90609c +compass, #acb2b2 +yellow_wool, #83bd9 +scaffolding, #4e71a6 +purpur_stairs, #578357 +dead_bubble_coral, #7c8488 +mangrove_chest_boat, #9dc9de +emerald, #d35ab1 +yellow_shulker_box, #844e3 +grindstone, #757575 +wolf_spawn_egg, #4ba8d5 +drowned_spawn_egg, #a338b1 +weathered_cut_copper_stairs, #936f95 +poisonous_potato, #747eca +painting, #6e7d92 +orange_candle, #2694ed +dark_oak_pressure_plate, #bed5ec +burn_pottery_sherd, #93c3ce +red_banner, #5e7eb2 +stripped_warped_hyphae, #c76a6d +amethyst_cluster, #5d8231 +powered_rail, #7793b6 +brick, #7bbfd2 +egg, #566389 +polished_blackstone_stairs, #cbd0c8 +blue_banner, #5e7eb2 +cracked_polished_blackstone_bricks, #d4dbd5 +piglin_spawn_egg, #6548c0 +prismarine_shard, #945d6e +lily_of_the_valley, #211528 +flowering_azalea_leaves, #9d91c4 +green_carpet, #ac93e5 +grass_block, #e8e001 +sculk_sensor, #f3e5df +oak_trapdoor, #849dc8 +lime_dye, #a464e9 +orange_glazed_terracotta, #666da5 +cyan_terracotta, #aaa5a5 +mangrove_boat, #9ed4dc +birch_boat, #6d7ca5 +cyan_banner, #5e7eb2 +jungle_door, #648fb1 +dark_oak_door, #bad2e9 +comparator, #89aeba +dropper, #868787 +iron_axe, #939bab +mangrove_slab, #8bcad0 +iron_leggings, #979797 +dark_oak_log, #c4d2e6 +spruce_button, #8eacd0 +silverfish_spawn_egg, #5610a2 +mangrove_hanging_sign, #9dcdd1 +red_concrete_powder, #58cace +white_shulker_box, #292423 +warped_trapdoor, #d18991 +iron_bars, #787579 +netherite_ingot, #c2c7c6 +smooth_red_sandstone_stairs, #4b9fe1 +sandstone_stairs, #283565 +light_blue_terracotta, #8f9477 +zombie_horse_spawn_egg, #1df02c +wither_skeleton_spawn_egg, #84604c +jungle_leaves, #e0e268 +turtle_spawn_egg, #1b0821 +vex_armor_trim_smithing_template, #b1a0a0 +smooth_red_sandstone, #4b9fe1 +glow_lichen, #907e87 +chiseled_sandstone, #283665 +calibrated_sculk_sensor, #f3e5df +brown_bed, #8eb9d8 +birch_log, #28292e +dark_oak_slab, #bed5ec +cyan_concrete_powder, #dc6d63 +lightning_rod, #3c91ad +jungle_fence, #608db0 +cod_bucket, #7f8585 +warped_roots, #ec7684 +acacia_hanging_sign, #7eb4d3 +dead_tube_coral, #8a9195 +brown_candle, #88b4d3 +coal, #dddfdc +snort_pottery_sherd, #99c6d1 +pink_wool, #137354 +chiseled_bookshelf, #4e70a8 +redstone_lamp, #a1cae2 +chiseled_deepslate, #cacaca +cat_spawn_egg, #83c082 +rose_bush, #7dbedb +stick, #b4c1d9 +mule_spawn_egg, #3f7000 +glow_ink_sac, #d59297 +ancient_debris, #a1c1c9 +vine, #a004e0 +oak_wood, #93abce +diamond_helmet, #dd8b95 +acacia_boat, #87bedb +jungle_pressure_plate, #608db0 +cherry_chest_boat, #5d8b9e +stripped_acacia_log, #52a4c5 +golden_sword, #6a81c8 +cobblestone, #818181 +yellow_stained_glass, #1b1bcd +reinforced_deepslate, #9a939c +diamond_hoe, #c8b0cc +acacia_stairs, #58a6ce +shulker_box, #75a075 +mossy_stone_brick_wall, #8d8797 +black_glazed_terracotta, #bde2e0 +jungle_boat, #92b3cb +brown_dye, #94c6ea +horn_coral, #2f46c2 +note_block, #a8c6d8 +sea_lantern, #543943 +crimson_fungus, #73d4e3 +acacia_slab, #58a6ce +sculk_catalyst, #b4a3a6 +iron_trapdoor, #363636 +pufferfish_bucket, #787e8f +netherite_chestplate, #c7cdcb +fire_coral, #5adbd2 +oak_slab, #5e7eb2 +book, #a6bad7 +jack_o_lantern, #2a68cc +diamond_horse_armor, #a23c67 +dead_brain_coral_fan, #4b4f52 +jungle_sign, #81a5c6 +jungle_chest_boat, #96b4d2 +gilded_blackstone, #c9d6da +purple_carpet, #87d654 +cobbled_deepslate_stairs, #b3b3b0 +raiser_armor_trim_smithing_template, #abb5be +lodestone, #898985 +rotten_flesh, #85c4e3 +spruce_wood, #c6dbf0 +brain_coral, #3bac68 +smithing_table, #c8dbda +prismarine_wall, #9e5f6b +mangrove_log, #adbed7 +large_fern, #8c493f +lime_concrete, #a258e8 +copper_ore, #848388 +skeleton_skull, #afc2ce +light_gray_wool, #72727a +anvil, #bcbcbc +pink_candle, #2d906c +brick_slab, #6a9fad +purple_wool, #87d654 +orange_concrete, #209f00 +red_carpet, #60d9de +coarse_dirt, #89abc5 +waxed_weathered_copper, #946792 +prismarine_bricks, #9d5562 +stone_bricks, #868786 +piglin_banner_pattern, #3d4457 +orange_bed, #108aed +bamboo_pressure_plate, #3f53b0 +end_portal_frame, #6a5d86 +shroomlight, #106eba +pitcher_pod, #98bdcd +iron_helmet, #a5a5a5 +frogspawn, #92a1aa +candle, #28447e +chorus_plant, #a3c7a3 +shears, #739096 +polar_bear_spawn_egg, #d610b2 +observer, #999999 +birch_wood, #28292e +bow, #b0bed9 +allium, #6f7248 +smooth_stone_slab, #595959 +rabbit_hide, #6f91b7 +brown_mushroom, #678ca4 +oak_pressure_plate, #5e7eb2 +oak_log, #93abce +ghast_tear, #826565 +jungle_planks, #608db0 +chorus_flower, #698869 +spruce_log, #c6dbf0 +beetroot_seeds, #7a93b9 +pointed_dripstone, #7893a3 +minecart, #bab3af +diamond_leggings, #d67a85 +paper, #2b2b2f +tropical_fish, #419ecb +ink_sac, #b7bdac +bamboo_mosaic_stairs, #4256b2 +dark_oak_boat, #bcd5eb +bread, #769be3 +axolotl_bucket, #5f7d64 +diamond_chestplate, #c85a67 +soul_sand, #afc2ce +polished_andesite_slab, #7c7a7b +birch_hanging_sign, #6e7ca4 +bat_spawn_egg, #5c9050 +phantom_spawn_egg, #4738a6 +music_disc_mall, #c6cabc +mangrove_stairs, #8bcad0 +orange_banner, #5e7eb2 +light_blue_candle, #d7733c +copper_block, #4095b1 +red_sandstone_stairs, #469de3 +magenta_terracotta, #6ba894 +andesite_slab, #787878 +hopper, #bdbcbd +pink_concrete, #2b9b72 +mud_brick_slab, #7799b1 +furnace_minecart, #acaaaa +bookshelf, #8ba2c5 +stone_slab, #838383 +light_gray_terracotta, #79969f +raw_copper, #77a0bb +netherite_sword, #bbcec5 +light_gray_concrete, #83838d +bundle, #8dc0de +cyan_carpet, #eb776f +suspicious_stew, #97abd1 +wither_skeleton_skull, #afc2ce +prismarine, #9e5f6b +gold_ore, #6f7b96 +raw_iron, #667b90 +packed_ice, #734c06 +exposed_cut_copper, #66879b +mangrove_trapdoor, #92d2d6 +mangrove_fence, #8bcad0 +spruce_fence, #8eacd0 +red_sandstone_slab, #469de3 +music_disc_13, #bcbec7 +smoker, #a9b5c7 +oxeye_daisy, #714a8f +golden_leggings, #5d76d6 +structure_void, #e8aaa3 +prismarine_slab, #9e5f6b +arrow, #858d9c +command_block_minecart, #97a3ae +beehive, #6382b5 +light_blue_stained_glass, #9a6728 +dirt_path, #7aa0bd +polished_diorite_stairs, #403f3e +deepslate_brick_stairs, #babab9 +magma_cube_spawn_egg, #240000 +glowstone_dust, #4c83bc +brown_concrete, #a0c5e1 +deepslate_redstone_ore, #98b7b6 +farmland, #7aa0bd +lapis_ore, #958b73 +obsidian, #f1f6e8 +dark_oak_wood, #c4d2e6 +cobblestone_wall, #818181 +black_carpet, #ecebe7 +mossy_cobblestone_wall, #928aa2 +cherry_button, #1e4e54 +zombified_piglin_spawn_egg, #22a815 +spruce_pressure_plate, #8eacd0 +tuff, #94939a +magenta_concrete_powder, #40ad48 +blaze_rod, #3c7ae6 +chiseled_stone_bricks, #898a89 +nether_brick_wall, #d4ebe6 +small_dripleaf, #a289d3 +black_concrete_powder, #e7e6e1 +cobblestone_stairs, #818181 +music_disc_chirp, #c3d2d1 +cobweb, #1c1716 +infested_cobblestone, #818181 +muddy_mangrove_roots, #bcc6d0 +polished_blackstone_pressure_plate, #cbd0c8 +birch_fence_gate, #405187 +ward_armor_trim_smithing_template, #bfa9a5 +skeleton_spawn_egg, #6db8f7 +sculk_shrieker, #f3e5df +gray_candle, #ad9f9b +polished_deepslate_slab, #b8b8b7 +green_stained_glass, #9a81cd +end_crystal, #4b6f3e +creeper_head, #afc2ce +cow_spawn_egg, #f4d02a +blue_concrete_powder, #bab75a +damaged_anvil, #bcbcbc +acacia_pressure_plate, #58a6ce +ender_eye, #b888a8 +oak_button, #5e7eb2 +deepslate_diamond_ore, #ad9696 +rabbit_foot, #5d80a8 +apple, #51e3e1 +piston, #9398a0 +white_banner, #5e7eb2 +stripped_birch_wood, #3c508a +iron_door, #484848 +stripped_spruce_wood, #8da7cc +torchflower, #9c9bb3 +red_wool, #60d9de +cherry_wood, #cadfd4 +torch, #768fc1 +piglin_head, #afc2ce +andesite_wall, #787878 +smooth_quartz, #141a21 +glow_berries, #618bd6 +red_nether_brick_slab, #bbf9f7 +oak_boat, #8ea4c6 +iron_pickaxe, #a3abbc +rabbit_spawn_egg, #6548c0 +dead_fire_coral, #788084 +lime_glazed_terracotta, #5e3bc9 +exposed_copper, #5f8399 +enchanted_golden_apple, #4374d8 +lime_concrete_powder, #8343d7 +cooked_mutton, #8cbbcc +magenta_bed, #43bc4d +stone_stairs, #838383 +blue_candle, #c6af5d +bamboo_block, #8170c7 +stripped_cherry_log, #296f6c +cobbled_deepslate, #b3b3b0 +magma_block, #72c1e1 +light_blue_dye, #a67c3f +polished_granite, #6696a7 +orange_stained_glass, #2881cd +stone_brick_slab, #868786 +polished_blackstone_button, #cbd0c8 +bubble_coral_block, #5be65e +pillager_spawn_egg, #17c89a +lantern, #6e8fad +cocoa_beans, #aacce5 +chiseled_quartz_block, #191e26 +cherry_sign, #3f7376 +blue_stained_glass_pane, #cdb44e +deepslate_tiles, #cacac9 +bamboo_sign, #5265b7 +light_gray_bed, #72727a +goat_horn, #b2b4b7 +dandelion, #6d54d5 +tall_grass, #24011d +lava_bucket, #6b8091 +netherite_upgrade_smithing_template, #a4c7c5 +stripped_cherry_wood, #296f6c +dispenser, #868787 +baked_potato, #517fd3 +granite_stairs, #6b99ab +lime_banner, #5e7eb2 +brown_stained_glass_pane, #9ab4cd +lead, #7ab0d4 +wandering_trader_spawn_egg, #a1703a +brush, #5a829e +black_bed, #ecebe7 +end_stone_brick_stairs, #26205e +brown_wool, #8eb9d8 +tropical_fish_spawn_egg, #837803 +stripped_warped_stem, #c76a6d +shield, #bed5ec +decorated_pot, #7fb8c5 +waxed_cut_copper, #4196b0 +netherite_hoe, #c0d1cd +crimson_slab, #9bd0ba +water_bucket, #918a76 +black_dye, #e5e6d8 +netherite_block, #bec3c1 +blackstone_wall, #d6ddd8 +blue_ice, #8c5903 +orange_terracotta, #5faddb +black_concrete, #f8f6f1 +dead_bubble_coral_fan, #3f4345 +tnt_minecart, #94b3bb +cooked_chicken, #4f90b6 +spruce_chest_boat, #a5bede +oxidized_cut_copper, #b16782 +sentry_armor_trim_smithing_template, #b1a6a6 +tide_armor_trim_smithing_template, #a75964 +red_sand, #429adf +hay_block, #5a78da +pufferfish_spawn_egg, #3ef0b7 +black_banner, #5e7eb2 +bamboo_fence_gate, #3247ac +blue_stained_glass, #cdb44e +dark_oak_sign, #afc8e3 +crimson_hanging_sign, #9bccb8 +tube_coral, #d1ad3b +brain_coral_fan, #36ac67 +mossy_stone_bricks, #8d8797 +yellow_candle, #2e57c8 +oak_stairs, #5e7eb2 +purple_banner, #5e7eb2 +beacon, #746b69 +golden_apple, #4374d8 +poppy, #8ebae0 +tnt, #4aa8ac +string, #716665 +redstone_block, #51e8fb +purple_glazed_terracotta, #93d168 +ender_pearl, #eca8b3 +cherry_fence_gate, #1e4e54 +cod_spawn_egg, #6d08c6 +jungle_fence_gate, #608db0 +acacia_fence_gate, #58a6ce +gray_terracotta, #c7d6dd +dead_brain_coral_block, #848b8e +stripped_bamboo_block, #3f53b0 +warped_sign, #d69a9b +chainmail_helmet, #a5a5a5 +mycelium, #8fa9b9 +command_block, #537d96 +rabbit, #315f70 +powder_snow_bucket, #6f615f +light_blue_shulker_box, #cf5d2c +diorite_wall, #444444 +warped_fence_gate, #d5989d +deepslate_copper_ore, #a4a3a7 +gold_ingot, #244dbe +deepslate_iron_ore, #969da2 +pig_spawn_egg, #3098ce +slime_ball, #9d65a5 +brain_coral_block, #31a561 +yellow_terracotta, #467bdd +polished_blackstone_brick_slab, #d0d6cf +lapis_lazuli, #d7ae59 +oak_hanging_sign, #758fb9 +petrified_oak_slab, #5e7eb2 +netherite_scrap, #b0ced6 +brewing_stand, #8a97b1 +skeleton_horse_spawn_egg, #48c079 +pink_tulip, #9461a9 +glass_pane, #746b69 +dead_tube_coral_block, #7e8589 +beetroot_soup, #a9d8f3 +orange_tulip, #906dbb +deepslate, #b0b0ae +acacia_fence, #58a6ce +light_blue_banner, #5e7eb2 +cooked_porkchop, #536a9b +golden_boots, #627ad5 +yellow_glazed_terracotta, #1640a8 +waxed_cut_copper_slab, #4196b0 +light_weighted_pressure_plate, #a30c3 +acacia_chest_boat, #8fbbdd +pumpkin, #3d8ee8 +orange_stained_glass_pane, #2881cd +barrier, #2c0000 +polished_andesite_stairs, #7c7a7b +redstone_ore, #749393 +mangrove_leaves, #920000 +glass, #746b69 +waxed_exposed_cut_copper_stairs, #66879b +leather_leggings, #60cbc0 +spyglass, #7091bd +podzol, #86a9c7 +iron_horse_armor, #9fa5a5 +black_terracotta, #dbeaf0 +acacia_door, #5da1c4 +mossy_cobblestone_slab, #928aa2 +diamond_pickaxe, #d1adc5 +blue_carpet, #cbc763 +diorite_slab, #444444 +carrot_on_a_stick, #a1b6d7 +warped_pressure_plate, #d5989d +warped_button, #d5989d +stripped_mangrove_wood, #89cad1 +magenta_candle, #5fce68 +black_candle, #d5d7bf +wet_sponge, #554bba +sticky_piston, #9398a0 +spruce_stairs, #8eacd0 +bamboo_door, #4255b1 +netherrack, #9fdada +milk_bucket, #757373 +glistering_melon_slice, #4895cc +clock, #4f71c1 +coal_ore, #979797 +andesite, #787878 +loom, #6c8aae +flower_pot, #97c9d6 +music_disc_otherside, #ccc4c6 +smooth_sandstone_slab, #212a56 +light_blue_glazed_terracotta, #a25c30 +howl_pottery_sherd, #94c4cf +wayfinder_armor_trim_smithing_template, #aab2bb +waxed_oxidized_cut_copper, #b16782 +polished_basalt, #a8a8a5 +smooth_red_sandstone_slab, #4b9fe1 +bee_nest, #3c6ab3 +red_stained_glass_pane, #67cdcd +green_stained_glass_pane, #9a81cd +piglin_brute_spawn_egg, #253070 +red_mushroom_block, #38d2d3 +ravager_spawn_egg, #116010 +medium_amethyst_bud, #628837 +brown_concrete_powder, #83accb +yellow_carpet, #83bd9 +basalt, #b7b8b3 +red_tulip, #a381db +cauldron, #c4c5c2 +yellow_bed, #83bd9 +stone_axe, #aab2c2 +waxed_oxidized_copper, #ae5e7c +sunflower, #a3cca +red_sandstone, #469de3 +light_blue_carpet, #c65127 +iron_boots, #9b9b9b +diamond_ore, #877374 +cooked_cod, #273646 +cracked_nether_bricks, #d8ece9 +stone_brick_wall, #868786 +magenta_carpet, #43bc4d +dragon_head, #afc2ce +quartz_bricks, #161b23 +clay, #605a4d +red_concrete, #72e0e0 +spruce_planks, #8eacd0 +evoker_spawn_egg, #b168cd +skull_banner_pattern, #3d4457 +salmon_bucket, #929189 +mossy_cobblestone_stairs, #928aa2 +lectern, #6b8bbd +cobbled_deepslate_wall, #b3b3b0 +cut_sandstone_slab, #273261 +deepslate_tile_slab, #cacac9 +warped_door, #d1797e +waxed_weathered_cut_copper, #936f95 +light_gray_carpet, #72727a +music_disc_wait, #c9c5c0 +arms_up_pottery_sherd, #96c5cf +acacia_button, #58a6ce +charcoal, #d9dde5 +stripped_dark_oak_log, #b8c8dc +warped_wart_block, #ea8987 +oxidized_copper, #ae5e7c +leather_helmet, #c03e80 +cactus, #a87ed3 +black_shulker_box, #e7e7e3 +diamond_axe, #d0a0b9 +deepslate_tile_stairs, #cacac9 +weeping_vines, #7cf0f4 +yellow_banner, #5e7eb2 +hopper_minecart, #afadab +nether_sprouts, #ed697b +light, #105e2 +raw_gold_block, #2357d2 +experience_bottle, #735dbe +brewer_pottery_sherd, #95c5d0 +wooden_axe, #b1c5ea +vex_spawn_egg, #72803c +lilac, #66836d +lily_pad, #b54fcc +crimson_fence, #9bd0ba +oak_leaves, #80d080 +blue_shulker_box, #d5d374 +green_candle, #b196eb +gray_stained_glass, #b4b4b4 +cherry_pressure_plate, #1e4e54 +quartz, #47545f +mangrove_planks, #8bcad0 +cherry_slab, #1e4e54 +wither_spawn_egg, #84604c +black_stained_glass_pane, #e7e7e7 +brick_wall, #6a9fad +purple_concrete_powder, #7dc94f +cyan_bed, #eb776f +warped_planks, #d5989d +lime_candle, #9650e2 +totem_of_undying, #4d74b4 +plenty_pottery_sherd, #99c7d1 +player_head, #afc2ce +oxidized_cut_copper_stairs, #b16782 +jigsaw, #b0bbaf +ender_chest, #f1f6e8 +coal_block, #f0f1f1 +cyan_wool, #eb776f +blue_glazed_terracotta, #d1c075 +hoglin_spawn_egg, #ce10c3 +birch_door, #31395f +waxed_copper_block, #4095b1 +mossy_stone_brick_slab, #8d8797 +cyan_glazed_terracotta, #cc8a83 +heart_of_the_sea, #ea9b7d +dark_oak_fence_gate, #bed5ec +oak_planks, #5e7eb2 +rabbit_stew, #82b3e1 +stone_hoe, #b3bcce +splash_potion, #e800e8 +red_shulker_box, #74e1e2 +name_tag, #5b6582 +music_disc_stal, #d2d2d2